2021 年 6 月青少年软编等考 C 语言一级真题解析

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 1a,b,c1000
  • 输出
    将计算结果保留 6 6 6 位小数输出。
  • 样例输入
    1 3 3
    
  • 样例输出
    1.000000
    

思路分析

此题考查算术运算,数据类型转换,以及浮点数精度控制,属于入门题。按照题目中的公式编写代码计算并输出即可。

至于算术运算中的整数除法转换为实数除法,可以使用自动类型转换,即将公式 (a / b) * c 写成 (1.0 * a / b) * c。由于 1.0double 型常量,因此 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 AZ 中的一个。

时间限制: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 1n 中所有幻数的和。

时间限制:1 s
内存限制:64 MB

  • 输入
    一个整数 n n n 1 < n < 10000 1 < n < 10000 1<n<10000
  • 输出
    一个整数,表示 1 ∼ n 1 \sim n 1n 中所有幻数的和。
  • 样例输入
    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;
}
  • 19
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
2018/07/20 周五 12:53 354 01求平均龄.cpp 2018/07/20 周五 12:53 327 02财务管理.cpp 2018/07/20 周五 12:53 357 03均值.cpp 2018/07/20 周五 12:53 375 04求整数的和与平均值.cpp 2018/07/20 周五 12:54 375 05最高的分数.cpp 2018/07/20 周五 12:54 371 06整数序列的元素最大跨度值.cpp 2018/07/20 周五 12:55 430 07奥运奖牌计数.cpp 2018/07/20 周五 12:55 281 08多边形内角和.cpp 2018/07/20 周五 12:55 237 09奇数求和.cpp 2018/07/20 周五 12:56 239 10满足条件的数累加.cpp 2018/07/20 周五 12:56 403 11整数的个数.cpp 2018/07/20 周五 12:56 257 12与指定数字相同的数个数.cpp 2018/07/20 周五 12:56 217 13乘方计算.cpp 2018/07/20 周五 12:57 324 14人口增长问题.cpp 2018/07/20 周五 12:57 307 15银行利息.cpp 2018/07/20 周五 12:57 433 16买房子.cpp 2018/07/20 周五 12:57 260 17斐波那契数列.cpp 2018/07/20 周五 12:58 461 18鸡尾酒疗法.cpp 2018/07/20 周五 12:58 392 19救援.cpp 2018/07/20 周五 12:58 280 20球弹跳高度的计算.cpp 2018/07/20 周五 12:58 450 21角谷猜想.cpp 2018/07/20 周五 12:59 520 22津津的储蓄计划.cpp 2018/07/20 周五 12:59 400 23药房管理.cpp 2018/07/20 周五 12:59 642 24正常血压.cpp 2018/07/20 周五 13:00 453 25求特殊自然数.cpp 2018/07/20 周五 13:00 387 26统计满足条件的4位数个数.cpp 2018/07/20 周五 13:00 244 27级数求和.cpp 2018/07/20 周五 13:00 296 28分离整数的各个数位.cpp 2018/07/20 周五 13:01 443 29数字反转.cpp 2018/07/20 周五 13:01 341 30含k个3的数.cpp 2018/06/10 周日 14:07 545 31开关灯.cpp 2018/07/20 周五 13:01 360 32求分数序列和.cpp 2018/07/20 周五 13:01 324 33计算分数加减表达式的值.cpp 2018/07/20 周五 13:02 220 34求阶乘和.cpp 2018/07/20 周五 13:02 304 35求出e的值.cpp 2018/07/20 周五 13:02 302 36计算多项式的值.cpp 2018/07/20 周五 13:03 378 37雇佣兵.cpp 2018/07/20 周五 13:03 540 38计算多项式导函数.cpp 2018/07/20 周五 13:03 377 39与7无关的数.cpp 2018/07/20 周五 13:03 331 40数1的个数.cpp 2018/07/20 周五 13:04 485 41数字统计.cpp 2018/07/20 周五 13:04 704 42画矩形.cpp 2018/07/20 周五 13:04 341 43质因数分解.cpp 2018/07/20 周五 13:04 531 44第n小的质数.cpp 2018/07/20 周五 13:05 341 45金币.cpp
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

朔北之忘 Clancy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值