
| 🔭 个人主页: 散峰而望 |
|---|
《C语言:从基础到进阶》《编程工具的下载和使用》《C语言刷题》《算法竞赛从入门到获奖》《人工智能AI学习》《AI Agent》
愿为出海月,不做归山云
🎬博主简介



【算法竞赛】C++入门(三)、C++输入输出 -- 习题篇
- 鸡兔共笼
- [计算 (a+b)×c 的值](#计算 (a+b)×c 的值)
- 带余除法
- 整数的个位
- 整数的十位
- 时间转换
- 小鱼的游泳时间
- 账户余额
- 交换值
- 成绩
- 浮点数向零舍入
- [打印 ASCII 码](#打印 ASCII 码)
- 打印字符
- 浮点除法
- 甲流疫情死亡率
- 温度表达转化
- 计算并联电阻的阻值
- 与圆相关的计算
- 对齐输出
- 糖果游戏
- 数字反转
- 三角形面积
- 结语
鸡兔共笼

由题目要求算出鸡兔各有多少只,该题有多种解法,这里我例举两种方法:
题解:
- 设鸡有 j 只,兔有 t 只,头记为 h,脚记为 f
- 法一:用方程
j + t == h,j * 2 + t * 4 == f
法二:假设都是 4 只脚(j + t) * 4 = 140,则多出来的脚数再除以 2 便得到鸡的数量
cpp
//法一
#include <iostream>
using namespace std;
int main()
{
int j = 0;//鸡
int t = 0;//兔
int h = 35;//头
int f = 94;//脚
t = (f - h * 2) / 2;
j = h - t;
cout << t << " " << j << endl;
return 0;
}
cpp
//法二
#include <iostream>
using namespace std;
int main()
{
int j = 0;//鸡
int t = 0;//兔
int h = 35;//头
int f = 94;//脚
j = (4 * h - f) / 2;
t = h - j;
cout << t << " " << j << endl;
return 0;
}
计算 (a+b)×c 的值

题目简单按照题目要求即可
cpp
#include <iostream>
using namespace std;
int a, b, c;
int main()
{
cin >> a >> b >> c;
int r = (a + b) * c;
cout << r << endl;
return 0;
}
提示:
这个题目一定能注意,数据范围,-10^4 < a,b,c < 10^4,(a+b)*c 的结果也不会超过有符号整型的最大值,而如果取值范围变成 -10^5 < a,b,c < 10^5,就需要使用 long long 类型了。
做题的时候一定要多留意数据范围。
带余除法

题目要求不仅得到整商,还要得到余数,即用 / 得到商,用 % 得到余数
cpp
#include <iostream>
using namespace std;
int a, b;
int main()
{
cin >> a >> b;
cout << a / b << " " << a % b << endl;
}
整数的个位

非常简单的题直接上代码
cpp
#include <iostream>
using namespace std;
int a;
int main()
{
cin >> a;
cout << a % 10 << endl;
return 0;
}
整数的十位

如果想要得到十位那么就要余上 100 得到十位和个位上面的数之后再把个位数除去即可。
题解:
- 假设输入的为 a
- 之后 a % 100 / 10即可
cpp
#include <iostream>
using namespace std;
int a;
int main()
{
cin >> a;
cout << a % 100 / 10 << endl;
return 0;
}
时间转换

题解:
由题目的示例 1,我们可以推测出秒是余数,而分钟需要除以 60 并余下 60 得到,小时除两次 60。
即:
- time除以60(1分钟有60秒)先换算出分钟数,分钟数除以60(1小时有60分钟)交换算成小时。
- time除以60(1分钟有60秒)先换算出分钟数,分钟数对60取模,就是换完小时后剩余的分钟数
- time对60取模,每60秒凑1分钟,还剩多少多少秒,没办法凑够一分钟。
cpp
#include <iostream>
using namespace std;
int main()
{
int time;
cin >> time;
cout << time / 60 / 60 << " " << time / 60 % 60 << " " << time % 60 << endl;
return 0;
}
小鱼的游泳时间

由题目可知,题目让我们求小鱼的游泳时间,即我们算出两个时间段的差值,然后按照小时分钟输出即可
题解:
- 输入两个时间点的时分
- 之后将小时换算成分钟计算两个时间点之间的时间段
- 接着将算出的时间重新换算成时分
cpp
#include <iostream>
using namespace std;
int main()
{
int a, b, c, d;
cin >> a >> b >> c >> d;
int t = c * 60 + d - a * 60 - b;
int h, m;
h = t / 60;
m = t % 60;
cout << h << " " << m << endl;
return 0;
}
账户余额
小明账户有 100 元,经过了下面的操作:
- 往里面存了 10 元
- 购物花掉了 20 元
- 把里面的钱全部取出
请在每次操作后输出账户余额:
cpp
#include <iostream>
using namespace std;
int main()
{
int balance = 100;
balance += 10;
cout << balance << endl;
balance -= 20;
cout << balance << endl;
balance = 0;
cout << balance << endl;
return 0;
}
提示:
使用复合赋值操作符能够让代码更简洁,但需要注意,不要一味地追求代码简洁,过于简洁的代码在可读性上会差一些。
交换值

题解:
非常简单的题目只需要设一个中间的变量,然后利用中间值交换一下就行。不过还有一种写法就是使用
^来处理不能使用中间变量交换的情况,到后面位运算和操作符会进行详细的讲解
cpp
#include <iostream>
using namespace std;
int main()
{
int a = 0;
int b = 0;
cin >> a >> b;
int c = a; //c是一个临时变量,作为中间变量实现交换的
a = b;
b = c;
cout << a << " " << b << endl;
return 0;
}
成绩

题解:
按照题目要求让 a,b,c 每一科乘以对应的百分比
同时还要注意题目要求总成绩一定是整数,需要乘以完各对应成绩的百分比后强转为整型
cpp
#include <iostream>
using namespace std;
int a,b,c;
int ret;
int main()
{
cin >> a >> b >> c;
ret = (int)(a * 0.2 + b * 0.3 + c * 0.5);//这里进行了强制类型转换
//也可以写成这样 int ret = (a * 0.2 + b * 0.3 + c * 0.5);
cout << ret << endl;
return 0;
}
浮点数向零舍入

非常简单题目,只需要注意一下图片中红框的内容。
cpp
#include <iostream>
using namespace std;
double x;
int main()
{
cin >> x;
cout << (long long)x << endl;//题目给的数据较大,强制转换为int,存在漏洞
return 0;
}
打印 ASCII 码

也是一道简单题只需要输出强转一下整型即可。
cpp
#include <iostream>
using namespace std;
int main()
{
char c = 0;
cin >> c;
cout << (int)c <<endl; //如果没有强制类型转换,编译器会认为c是字符类型,打印的依然是字符
return 0;
}
打印字符

和上面的那道题一样输出时需要强转类型。
cpp
#include <iostream>
using namespace std;
int main()
{
int n = 0;
cin >> n;
cout << (char)n <<endl; //利用强制类型转换,将ASCII码值按照字符类型打印
return 0;
}
浮点除法

题解:
根据题目要求输入两个整数然后相除得到一个小数,并且只有小于等于 10^3 时才被接受。
即我们需要保证最后输出的小数保留有 3 位小数
cpp
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int a, b;
cin >> a >> b;
printf("%.3lf\n", a * 1.0 / b);
return 0;
}
甲流疫情死亡率

和上面一道题类似,只需要注意一下以下一些情况:
- 百分号 % 可以这样输出:printf("%%");
- 注意a和b的取值范围
- 百分比不是直接b/a,是需要乘以100.0的,因为需要得到小数,所以要是小数除法
- 有时候:先乘 100 再除 a,还是先除 a 再乘 100 是有差异的。
比如:4/8 * 100 和 4 * 100/8 的结果就有差异的。


cpp
#include<cstdio>
int main()
{
int a, b;
scanf("%d%d", &a, &b);
printf("%.3lf%%\n", b * 100.0 / a);
return 0;
}
温度表达转化

按照题目要求输入输出就行。
cpp
#include <cstdio>
int main()
{
double f = 0;
scanf("%lf", &f);
double c = 5 * (f - 32) / 9.0;
printf("%.5lf\n", c);
return 0;
}
计算并联电阻的阻值

按照题目要求输入输出就行。
cpp
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
double r1 = 0, r2 = 0;
cin >> r1 >> r2;
double ret = 1.0 / (1.0 / r1 + 1.0 / r2);
printf("%.2lf\n", ret);
return 0;
}
与圆相关的计算

按照题目要求输入输出就行。
cpp
#include <iostream>
#include <cstdio>
using namespace std;
const double PI = 3.14159;
double r, z, len, area;
int main()
{
cin >> r;
z = 2 * r;
len = 2 * PI * r;
area = PI * r * r;
printf("%.4lf %.4lf %.4lf\n", z, len, area);
return 0;
}
对齐输出

按照题目要求输入输出就行。
cpp
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int a, b, c;
cin >> a >> b >> c;
printf("%8d %8d %8d\n", a, b, c);
return 0;
}
糖果游戏


题解:
这道题稍微复杂一些,这里举个例子。假如 1 小朋友有 7 个糖果,需要分成 3 份,分别给旁边的 2 和 5 小朋友,即最后 1 小朋友留下 2 个糖果,2 和 5 各得 2 糖果,多的糖果被 1 小朋友吃掉。之后 2,3,4,5 小朋友重复以上操作。
然后最好画一个图分清每个小朋友给糖情况。
cpp
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int a, b, c, d, e;
cin >> a >> b >> c >> d >> e;
a /= 3; e += a; b += a;
b /= 3; a += b; c += b;
c /= 3; b += c; d += c;
d /= 3; c += d; e += d;
e /= 3; d += e; a += e;
printf("%5d%5d%5d%5d%5d\n",a ,b, c, d, e);
return 0;
}
数字反转

按照题目要求输入输出即可。
cpp
//代码1
#include <iostream>
using namespace std;
int main()
{
char a, b, c, d, e;
cin >> a >> b >> c >> d >> e;
cout << e << d << c << b << a << endl;
return 0;
}
//代码2
#include <cstdio>
int main()
{
char a, b, c, d;
scanf("%c%c%c.%c", &a, &b, &c, &d);
printf("%c.%c%c%c\n", d, c, b, a);
return 0;
}
三角形面积

cpp
//代码1
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
int main()
{
double a, b, c;
cin >> a >> b >> c;
double p = (a + b + c) / 2;
double area = sqrt(p * (p - a) * (p - b) * (p - c));
cout << fixed << setprecision(1) << area << endl;
return 0;
}
//代码2
#include <iostream>
#include <cmath>
#include <cstdio>
using namespace std;
int main()
{
double a, b, c;
cin >> a >> b >> c;
double p = (a + b + c) / 2;
double area = sqrt(p * (p - a) * (p - b) * (p - c));
printf("%.1f\n", area);
return 0;
}
这里给大家介绍一个库函数 sqrt,这个函数是计算平方根的,函数原型如下:
cpp
double sqrt (double x);
float sqrt (float x);
long double sqrt (long double x);
函数可以计算出参数 x 的平方根,然后返回,这个函数需要的头文件是 < cmath >。
结语
这些可以熟悉C++的基本输入输出操作,包括 cin 和 cout 的使用、数据类型的匹配以及简单的格式化输出。
掌握这些基础技能是算法竞赛的起点,后续的题目会涉及更复杂的数据处理和逻辑控制。建议反复练习,确保能快速准确地处理输入输出,为更高阶的算法学习打下坚实基础。
多尝试不同的输入输出方式,如读取多组数据、处理字符串或特殊格式要求,逐步提升代码的效率。
愿诸君能一起共渡重重浪,终见缛彩遥分地,繁光远缀天。
