目录
- T1. 数的输入和输出
- 思路分析
- T2. (a / b) × c 的值
- 思路分析
- T3. 大写字母的判断
- 思路分析
- T4. 特殊求和
- 思路分析
- T5. 硬币翻转
- 思路分析
T1. 数的输入和输出
输入一个整数和双精度浮点数,先将浮点数保留 2 2 2 位小数输出,然后输出整数。
时间限制:1 s
内存限制:64 MB
- 输入
一行两个数,分别为整数 n n n(不超过整型范围),双精度浮点数 f f f,以一个空格分开。 - 输出
一行两个数,分别为保留 2 2 2 位小数输出的 f f f,以及整数 n n n,以一个空格分开。 - 样例输入
100 123.456789
- 样例输出
123.46 100
思路分析
此题考查整数和浮点数的输入输出,以及浮点数精度控制,属于入门题。按照样例输出的格式编写代码输出即可,注意输出变量的顺序与输入顺序是相反的。
/** Name: T1.cpp* Problem: 数的输入和输出* Author: Teacher Gao.* Date&Time: 2024/03/04 20:31*/#include <cstdio>using namespace std;int main()
{int a;double b;scanf("%d%lf", &a, &b);printf("%.2f %d\n", b, a);return 0;
}
T2. (a / b) × c 的值
给定整数 a a a、 b b b、 c c c,计算 ( a / b ) × c (a / b) \times c (a/b)×c 的值,这里的除法为实数除法。
时间限制:1 s
内存限制:64 MB
- 输入
一行,三个整数 a a a、 b b b、 c c c,整数间以空格分隔。 1 ≤ a , b , c ≤ 1000 1 ≤ a,b,c ≤ 1000 1≤a,b,c≤1000。 - 输出
将计算结果保留 6 6 6 位小数输出。 - 样例输入
1 3 3
- 样例输出
1.000000
思路分析
此题考查算术运算,数据类型转换,以及浮点数精度控制,属于入门题。按照题目中的公式编写代码计算并输出即可。
至于算术运算中的整数除法转换为实数除法,可以使用自动类型转换,即将公式 (a / b) * c
写成 (1.0 * a / b) * c
。由于 1.0
是 double
型常量,因此 1.0 * a
的值会是 double
型,而数值大小并未发生变化。
更多数据类型转换相关内容,可以参考基本类型这篇文章。
/** Name: T2.cpp* Problem: (a / b) × c 的值* Author: Teacher Gao.* Date&Time: 2024/03/04 20:33*/#include <cstdio>using namespace std;int main()
{int a, b, c;scanf("%d%d%d", &a, &b, &c);printf("%.6f", (1.0 * a / b) * c);return 0;
}
T3. 大写字母的判断
输入一个字符,判断是否是英文大写字母,即是否是 A ∼ Z A \sim Z A∼Z 中的一个。
时间限制:1 s
内存限制:64 MB
- 输入
一个字符。 - 输出
如果是英文大写字母,则输出YES
,否者输出NO
。 - 样例输入
K
- 样例输出
YES
思路分析
此题考查分支结构,以及关系运算与逻辑运算,属于入门题。此题相比同年 3 3 3 月份的 T3,难度降低了不少。
C/C++ 中的 char
类型是以 ASCII 码的形式存储在内存中的,而 ASCII 码是对常用的 128 128 128 个字符进行了整数编码,因此在 C/C++ 中我们有时把 char
类型也称为整数类型。整数类型支持关系运算,因此我们可以直接对 char
类型数据执行关系运算,以确定该数据是否在我们所需要的范围。
/** Name: T3.cpp* Problem: 大写字母的判断* Author: Teacher Gao.* Date&Time: 2024/03/04 20:35*/#include <iostream>using namespace std;int main()
{char ch;cin >> ch;if ('A' <= ch && ch <= 'Z') {cout << "YES" << endl;}else {cout << "NO" << endl;}return 0;
}
T4. 特殊求和
如果一个数能够被 7 7 7 整除或者十进制表示中含有数字 7 7 7,那么我们称这个数为幻数,比如 17 17 17, 21 21 21, 73 73 73 是幻数,而 6 6 6, 59 59 59 不是。
对于给定的 n n n,求出 1 ∼ n 1 \sim n 1∼n 中所有幻数的和。
时间限制:1 s
内存限制:64 MB
- 输入
一个整数 n n n。 1 < n < 10000 1 < n < 10000 1<n<10000。 - 输出
一个整数,表示 1 ∼ n 1 \sim n 1∼n 中所有幻数的和。 - 样例输入
14
- 样例输出
21
思路分析
此题考查循环结构,分支结构判断倍数关系,以及数位拆分,属于一般应用题。此题相比同年 3 3 3 月份的 T4,难度提升较大,涉及到循环嵌套和较为复杂的逻辑。
此题需要用循环遍历 1 1 1 到 n n n 之间的所有整数,依次判断每个数 i
。若 i
是 7 7 7 的倍数,则将其累加;若 i
不是 7 7 7 的倍数,则对 i
进行数位拆分,依次判断每一位是否为 7 7 7,若为 7 7 7,则将 i
累加。
需要注意数位拆分过程中可能会修改 i
的值,这可能导致外层循环无法退出,因此需要一个临时变量 t
来存储 i
的值,然后对 t
进行数位拆分,这样就不会影响外层循环的进行。此外,一旦检测到 t
的某一位数值是 7 7 7,则将 i
累加,而不是 t
,因为此时 t
可能已经被改变了。并且累加之后要及时结束数位拆分的过程,否则可能会将 i
累加多次,导致结果偏大。
/** Name: T4.cpp* Problem: 特殊求和* Author: Teacher Gao.* Date&Time: 2024/03/04 20:36*/#include <iostream>using namespace std;int main()
{int n, sum = 0;cin >> n;for (int i = 1; i <= n; i++) {if (i % 7 == 0) {sum += i;continue;}int t = i;while (t) {if (t % 10 == 7) {sum += i;break;}t /= 10;} }cout << sum << endl;return 0;
}
T5. 硬币翻转
假设有 n n n 个硬币( n n n 为不大于 5000 5000 5000 的正整数),从 1 1 1 到 n n n 按顺序依次编号,初始时全部处于正面向上的状态;有 m m m 个人( m m m 为不大于 n n n 的正整数)也从 1 1 1 到 m m m 依次编号。
第一个人( 1 1 1 号)将硬币全部翻转一次,第二个人( 2 2 2 号)将编号为 2 2 2 的倍数的硬币翻转一次,第三个人( 3 3 3 号)将编号为 3 3 3 的倍数的硬币翻转一次。依照编号递增顺序,以后的人都和 3 3 3 号一样,将凡是自己编号倍数的硬币翻转一次。
请问:当第 m m m 个人操作之后,哪些硬币是正面向上的,按从小到大输出其编号,以空格分开。
时间限制:1 s
内存限制:64 MB
- 输入
输入正整数 n n n 和 m m m,以单个空格隔开。 - 输出
顺次输出正面向上的硬币的编号,其间用空格间隔。 - 样例输入
10 10
- 样例输出
2 3 5 6 7 8 10
思路分析
此题考查循环结构,以及标记法,属于基础题。但是涉及到数组,相比同年 3 3 3 月份的 T5,难度提升较大。
此题可以设置一个数组 a[]
,用来标记每一个硬币的状态(正面朝上还是反面朝上),我们可以用 a[i] == 0
表示正面朝上,a[i] == 1
表示反面朝上。然后用两层循环分别枚举硬币编号 i
和人的编号 j
,若硬币编号是人的编号的倍数,即 i % j == 0
,则将硬币状态进行反转。当两层循环枚举结束之后,依次遍历每一个硬币的状态 a[i]
,若 a[i] == 0
则表示编号为 i
的硬币正面朝上,输出 i
即可。
两层循环枚举时,外层循环枚举人的编号或者硬币编号都可以。不过若用外层循环枚举人的编号 j
,那么内层循环枚举硬币编号 i
时可以从 j
开始,步长设为 j
,这样就不需要用 if
语句判断硬币编号是否是人的编号的倍数了(见参考代码)。此外,反转硬币状态可以用 a[i] = !a[i]
代替 if
语句的判断。
在此题中,若人的数量 m m m 与硬币数量 n n n 相等,则可以利用数学知识进行求解,既不需要数组,也不需要两层循环嵌套,只需要一层循环即可解决,可以极大地简化程序,并提高程序效率。
/** Name: T5.cpp* Problem: 硬币翻转* Author: Teacher Gao.* Date&Time: 2024/03/04 20:41*/#include <iostream>using namespace std;int main()
{int n, m;bool a[5005] = {0};cin >> n >> m;// 枚举人的编号for (int j = 1; j <= m; j++) {// 枚举硬币编号for (int i = j; i <= n; i += j) {a[i] = !a[i];}}for (int i = 1; i <= n; i++) {if (!a[i]) {cout << i << " ";}}return 0;
}