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

T1. 满足条件的数的累加 2

现有 n n n 个整数,将其中个位数为 k k k 的数进行累加求和。

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

  • 输入
    第一行 1 1 1 个整数 n n n 0 < n < 1000 0 < n < 1000 0<n<1000
    第二行 n n n 个非负整数,以空格分隔,每个数不大于 100000 100000 100000
    第三行 1 1 1 个整数 k k k 0 ≤ k ≤ 9 0 \le k \le 9 0k9
  • 输出
    输出满足题目要求的累加和。
  • 样例输入
    10
    2 5 7 17 11 18 4 27 1 7
    7
    
  • 样例输出
    58
    

思路分析

此题考查数组的查询操作,以及取余运算,属于入门题。

此题只需要将数据输入数组中,然后依次遍历每个元素,检测个位是否为 k k k,若是,则进行累加即可。

/*
 * Name: T1.cpp
 * Purpose: 满足条件的数的累加 2
 * Author: Teacher Gao.
 * Date&Time: 2024/09/24 18:46
 */

#include <cstdio>

using namespace std;

int main()
{
    int n, a[1005], k, sum = 0;
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) {
        scanf("%d", &a[i]);
    }
    scanf("%d", &k);

    for (int i = 1; i <= n; i++) {
        if (a[i] % 10 == k) {
            sum += a[i];
        }
    }

    printf("%d", sum);

    return 0;
}

T2. 偶数降序输出

给定一个长度为 n n n 的正整数序列,请将其中的所有偶数取出,并按降序输出。

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

  • 输入
    2 2 2 行:
    1 1 1 行为 n n n。不大于 500 500 500
    2 2 2 行为 n n n 个正整数,其间用空格间隔。
  • 输出
    降序输出的偶数序列,数之间以空格间隔。数据保证至少有一个偶数。
  • 样例输入
    10
    1 3 2 6 5 4 9 8 7 10
    
  • 样例输出
    10 8 6 4 2
    

思路分析

此题考查排序算法,难度一般。

先将所有元素按照降序排序,然后依次遍历并输出其中的偶数即可。

/*
 * Name: T2.cpp
 * Purpose: 偶数降序输出
 * Author: Teacher Gao.
 * Date&Time: 2024/09/24 18:49
 */

#include <cstdio>
#include <algorithm>
#include <functional>

using namespace std;

int main()
{
    int n, a[505];
    
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) {
        scanf("%d", &a[i]);
    }

    sort(a + 1, a + n + 1, greater<int>());

    for (int i = 1; i <= n; i++) {
        if (a[i] % 2 == 0) {
            printf("%d ", a[i]);
        }
    }

    return 0;
}

T3. 替换单词

输入一个字符串,以回车结束(字符串长度 ≤ 100 \le 100 100)。该字符串由若干个单词组成,单词之间用一个空格隔开,所有单词区分大小写。现需要将其中的某个单词替换成另一个单词,并输出替换之后的字符串。

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

  • 输入
    输入包括 3 3 3 行:
    1 1 1 行是包含多个单词的字符串 s s s
    2 2 2 行是待替换的单词 a a a,长度 ≤ 100 \le 100 100
    3 3 3 行是a将被替换的单词 b b b,长度 ≤ 100 \le 100 100
    s , a , b s, a, b s,a,b 最前面和最后面都没有空格。
  • 输出
    输出只有 1 1 1 行,将 s s s 中所有单词 a a a 替换成 b b b 之后的字符串。
  • 样例输入
    You want someone to help you
    You
    I
    
  • 样例输出
    I want someone to help you
    

思路分析

此题考查字符串的查找替换操作,属于入门题。

此题第一行的字符串 s s s 包含空格,需要整行读入,第二行和第三行的单词 a a a b b b 正常读入即可。之后在字符串 s s s 中反复不断的查询单词 a a a,只要找到就替换为单词 b b b,直到字符串 s s s 中不再有单词 a a a。示例代码中的 string::npos 是一个常量,在 64 64 64 位机器下,表示 unsigned long long 的最大值,将其转换为带符号数之后,值为 − 1 -1 1

/*
 * Name: T3.cpp
 * Problem: 替换单词
 * Author: Teacher Gao.
 * Date&Time: 2024/10/02 10:05
 */

#include <iostream>
#include <string>

using namespace std;

int main()
{
	string s, a, b;
	getline(cin, s);
	cin >> a >> b;

	while (s.find(a) != string::npos) {
		s.replace(s.find(a), a.size(), b);
	}

	cout << s << endl;

	return 0;
}

T4. 图像处理

给定 n n n m m m 列的图像各像素点的灰度值,要求用如下方法对其进行模糊化处理:

  1. 四周最外侧的像素点灰度值不变;
  2. 中间各像素点新灰度值为该像素点及其上下左右相邻四个像素点原灰度值的平均(舍入到最接近的整数)。

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

  • 输入
    第一行包含两个整数 n n n m m m,表示图像包含像素点的行数和列数。 1 ≤ n ≤ 100 1 \le n \le 100 1n100 1 ≤ m ≤ 100 1 \le m \le 100 1m100
    接下来 n n n 行,每行 m m m 个整数,表示图像的每个像素点灰度。相邻两个整数之间用单个空格隔开,每个元素均在 0 ∼ 255 0 \sim 255 0255 之间。
  • 输出
    n n n 行,每行 m m m 个整数,为模糊处理后的图像。相邻两个整数之间用单个空格隔开。
  • 样例输入
    4 5
    100 0 100 0 50
    50 100 200 0 0
    50 50 100 100 200
    100 100 50 50 100
    
  • 样例输出
    100 0 100 0 50
    50 80 100 60 0
    50 80 100 90 200
    100 100 50 50 100
    

思路分析

此题考查二维数组的遍历操作,属于入门题。

在输入结束之后,依次枚举每一个内部元素,计算其灰度值,并且存储到另一个二维数组中,最后进行输出即可。注意不可直接存储在原始数组中,否则会影响其余点的灰度值计算结果。为了输出方便,我们可以先将原始数据直接复制到目标数组中,避免了输出边缘元素的麻烦。四舍五入的过程可以用利用类型转换来实现。

/*
 * Name: T4.cpp
 * Problem: 图像处理
 * Author: Teacher Gao.
 * Date&Time: 2024/10/02 11:09
 */

#include <iostream>

using namespace std;

int main()
{
	int n, m;
	int a[105][105] = {0}, b[105][105] = {0};
	cin >> n >> m;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			cin >> a[i][j];
			b[i][j] = a[i][j];
		}
	}

	for (int i = 2; i <= n - 1; i++) {
		for (int j = 2; j <= m - 1; j++) {
			int t = a[i][j] + a[i-1][j] + a[i][j-1] + a[i][j+1] + a[i+1][j];
			b[i][j] = 1.0 * t / 5 + 0.5;
		}
	}

	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			cout << b[i][j] << " ";
		}
		cout << endl;
	}

	return 0;
}

T5. 字符统计

给定一个由 a ∼ z a \sim z az 26 26 26 个字符组成的字符串,统计其中哪个字符出现的次数最多。

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

  • 输入
    输入包含一行,一个字符串,长度不超过 1000 1000 1000
  • 输出
    输出一行,包括出现次数最多的字符和该字符出现的次数,中间以一个空格分开。如果有多个字符出现的次数相同且最多,那么输出 ASCII \text{ASCII} ASCII 码最小的那一个字符。
  • 样例输入
    abbccc
    
  • 样例输出
    c 3
    

思路分析

此题考查一维数组的查找与统计操作,难度一般。

可以利用桶的思想进行计数统计,在统计完毕之后进行遍历打擂台即可。由于字符在计算机中是用整数进行存储的,因此可以直接用字符作为数组下标进行统计。

/*
 * Name: T5.cpp
 * Problem: 字符统计
 * Author: Teacher Gao.
 * Date&Time: 2024/10/02 11:16
 */

#include <iostream>
#include <string>

using namespace std;

int main()
{
	int a[130] = {0};
	string s;
	cin >> s;
	for (int i = 0; i < s.size(); i++) {
		a[s[i]]++;
	}

	int ch = 'a';
	for (int i = 'a'; i <= 'z'; i++) {
		if (a[i] > a[ch]) {
			ch = i;
		}
	}

	cout.put(ch);
	cout << " " << a[ch] << endl;

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

朔北之忘 Clancy

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

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

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

打赏作者

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

抵扣说明:

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

余额充值