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

T1. 倒序输出

依次输入 4 4 4 个整数 a a a b b b c c c d d d,将他们倒序输出,即依次输出 d d d c c c b b b a a a 4 4 4 个数。

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

  • 输入
    一行 4 4 4 个整数 a a a b b b c c c d d d,以空格分隔。 0 < a , b , c , d < 1 0 8 0 < a,b,c,d < 10^8 0<a,b,c,d<108
  • 输出
    一行 4 4 4 个整数 d d d c c c b b b a a a,整数之间以一个空格分隔。
  • 样例输入
    1 2 3 4
    
  • 样例输出
    4 3 2 1
    

思路分析

此题考查基本输入输出,属于入门题。按照题目要求进行输入输出即可。

/*
 * Name: T1.cpp
 * Problem: 倒序输出
 * Author: Teacher Gao.
 * Date&Time: 2024/03/04 22:36
 */

#include <iostream>

using namespace std;

int main()
{
	int a, b, c, d;
	cin >> a >> b >> c >> d;

	cout << d << " " << c << " " << b << " " << a << endl;

	return 0;
}

T2. 平方差计算

给定的两个整数 a , b a, b a,b,他们的平方差结果为 a 2 − b 2 a^2-b^2 a2b2,可以化简为 ( a + b ) ( a − b ) (a + b)(a-b) (a+b)(ab)。例如 5 5 5 4 4 4 的平方差为 5 2 − 4 2 = ( 5 + 4 ) ( 5 − 4 ) = 9 5^2-4^2=(5+4)(5-4)=9 5242=(5+4)(54)=9。现给定两个整数,求他们的平方差。

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

  • 输入
    一行两个整数 a a a b b b,以空格分隔。 0 < b < a < 1 0 4 0 < b < a < 10^4 0<b<a<104
  • 输出
    输出 a a a b b b 的平方差。
  • 样例输入
    5 4
    
  • 样例输出
    9
    

思路分析

此题考查算术运算,属于入门题。

此题只需按照题目中给出的公式进行计算输出即可,题目中有两个公式,使用任意一个皆可。

/*
 * Name: T2.cpp
 * Problem: 平方差计算
 * Author: Teacher Gao.
 * Date&Time: 2024/03/04 22:37
 */

#include <iostream>

using namespace std;

int main()
{
	int a, b;
	cin >> a >> b;

	cout << (a + b) * (a - b);

	return 0;
}

T3. 最小的数

依次输入 3 3 3 个整数 a a a b b b c c c,将 a a a b b b c c c 中的最小值输出。

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

  • 输入
    一行 3 3 3 个整数 a a a b b b c c c,以空格分隔。 0 < a , b , c < 1 0 8 0 < a,b,c < 10^8 0<a,b,c<108
  • 输出
    1 1 1 个整数,即 3 3 3 个整数的最小值。
  • 样例输入
    2 3 2
    
  • 样例输出
    2
    

思路分析

此题考察分支结构比较大小,属于入门题。

此题可以用分支嵌套解决,是一种容易想到的做法。若 a > b,则继续比较 bc,否则就比较 ac

此题也可以用级联 if 语句结合逻辑运算符求解,也比较容易想到。若 a < b 并且 a < c,那么 a 就是最小值;若 b < a 并且 b < c,那么 b 就是最小值;以上两种情况都不符合的情况下,c 就是最小值。

此题还可以连用两次单分支,执行打擂台,这种做法不太容易想到。可以假设 a 是最小值(擂主),然后用 ba 作比较,若 b 小于 ab 战胜了擂主),则用 b 更新 ab 成为新擂主)。对 c 采取同样的处理方式即可。详见参考代码。

/*
 * Name: T3.cpp
 * Problem: 最小的数
 * Author: Teacher Gao.
 * Date&Time: 2024/03/04 22:40
 */

#include <iostream>

using namespace std;

int main()
{
	int a, b, c;
	cin >> a >> b >> c;

	if (b < a) {
		a = b;
	}
	if (c < a) {
		a = c;
	}

	cout << a << endl;

	return 0;
}

T4. 计算成绩优秀的人数

现有一个班一门课程考试的分数,请统计其中成绩为优秀的人数。成绩为优秀的要求是分数大于等于 85 85 85

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

  • 输入
    第一行 1 1 1 个整数 n n n,表示分数的个数。 0 < n ≤ 100 0 < n ≤ 100 0<n100
    第二行 n n n 个正整数,表示每一个分数,每个分数小于等于 100 100 100
  • 输出
    输出一个整数,表示成绩为优秀的人数。
  • 样例输入
    10
    85 70 99 90 78 55 100 62 88 84
    
  • 样例输出
    5
    

思路分析

此题考查循环结构与分支结构,属于入门题。

此题需要依次判断输入的每个数 x。若 x 大于或等于 85 85 85,则答案累加 1 1 1

/*
 * Name: T4.cpp
 * Problem: 计算成绩优秀的人数
 * Author: Teacher Gao.
 * Date&Time: 2024/03/04 22:56
 */

#include <iostream>

using namespace std;

int main()
{
	int n, x;
	cin >> n;

	int tot = 0;
	for (int i = 1; i <= n; i++) {
		cin >> x;
		if (x >= 85) {
			tot++;
		}
	}

	cout << tot << 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
    
  • 样例输出
    1,4,9
    

思路分析

此题考查循环结构,以及标记法,属于基础题,不过输出逗号的要求给这道题增加了不少难度。思路与 2021 2021 2021 6 6 6 月份考试的 T5 一致,可以参考 2021 年 6 月青少年软编等考 C 语言一级真题解析中的 T5。

需要注意的是,此题输出的是与原始状态相反的灯的编号。此外,两个输出的整数之间需要输出一个逗号,这里也可以采用标记法这个技巧。将输出看作是先输出一个逗号,再输出一个整数,于是我们只需要将第一个逗号处理掉就可以了。具体来说,可以在输出前设置一个标记 flag = 1,输出时检测该标记是否为 1 1 1。若是,则将 flag 赋值为 0 0 0,否则输出一个逗号。

当然,我们还可以采用一种更简单的方式来处理,那就是将输出的第 1 1 1 个数单独放在循环之前进行输出,这样循环内部就只需要从第 2 2 2 个数开始输出,每次输出时先输出逗号 ,,再输出数字即可。根据题目中的数据范围,可以确定第 1 1 1 个被输出的数字一定是 1,因为这个开关只会被第 1 1 1 个人按一次。虽然这种方式的通用性比不上前面的标记法,但代码确实简单。参考代码仍然以更具通用性的标记法为例,至于第二种方法,大家可以自行尝试。

/*
 * Name: T5.cpp
 * Problem: 开关灯
 * Author: Teacher Gao.
 * Date&Time: 2024/03/04 20:50
 */

#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];
        }
    }

	bool flag = 1;
    for (int i = 1; i <= n; i++) {
        if (a[i]) {
			if (flag) {
				flag = 0;
			}
			else {
				cout << ",";
			}
            cout << i;
        }
    }

	return 0;
}
  • 18
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

朔北之忘 Clancy

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

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

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

打赏作者

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

抵扣说明:

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

余额充值