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

目录

  • T1. 数字放大
  • T2. 单词倒排
  • T3. 计算矩阵边缘元素之和
    • 思路分析
  • T4. 奇数单增序列
  • T5. 实数加法
    • 思路分析

T1. 数字放大

题目链接:SOJ D1070

此题为 2021 年 6 月二级第一题原题,见 2021 年 6 月青少年软编等考 C 语言二级真题解析中的 T1。

T2. 单词倒排

题目链接:SOJ D1005

此题为 2020 年 9 月二级第一题原题,见 2020 年 9 月青少年软编等考 C 语言二级真题解析中的 T1。

T3. 计算矩阵边缘元素之和

题目链接:SOJ D1254

输入一个整数矩阵,计算位于矩阵边缘的元素之和。所谓矩阵边缘的元素,就是第一行和最后一行的元素以及第一列和最后一列的元素。

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

  • 输入
    第一行分别为矩阵的行数 m m m 和列数 n n n m < 100 m < 100 m<100 n < 100 n < 100 n<100,两者之间以一个空格分开。
    接下来输入的 m m m 行数据中,每行包含 n n n 个整数,整数之间以一个空格分开。
  • 输出
    输出对应矩阵的边缘元素和。
  • 样例输入
    3 3
    3 4 1
    3 7 1
    2 0 1
    
  • 样例输出
    15
    

思路分析

此题考查嵌套循环,属于入门题。

根据题目描述,我们应该定义一个二维数组进行存储与求解。事实上,只需要判断当前输入的数据是否处于矩阵边缘即可,无需二维数组,详见参考代码。

/*
 * Name: T3.cpp
 * Problem: 计算矩阵边缘元素之和
 * Author: Teacher Gao.
 * Date&Time: 2024/11/16 00:06
 */

#include 

using namespace std;

int main(){
	int m, n, x, sum = 0;

	cin >> m >> n;
	for (int i = 1; i <= m; i++) {
		for (int j = 1; j <= n; j++) {
			cin >> x;
			if (i == 1 || j == 1 || i == m || j == n) {
				sum += x;
			}
		}
	}
    
    cout << sum;
    
    return 0;
}

T4. 奇数单增序列

题目链接:SOJ D1023

此题为 2020 年 12 月二级第四题原题,见 2020 年 12 月青少年软编等考 C 语言二级真题解析中的 T4。

T5. 实数加法

题目链接:SOJ D1255

求两个实数相加的和。

题目中输入输出里出现的浮点数都有如下的形式: P 1 P 2 . . . P i . Q 1 Q 2 . . . Q j P_1P_2...P_i.Q_1Q_2...Q_j P1P2...Pi.Q1Q2...Qj。对于整数部分, P 1 P 2 . . . P i P_1P_2...P_i P1P2...Pi 是一个非负整数且当整数部分不为 0 0 0 时, P 1 P_1 P1 不等于 0 0 0;对于小数部分, Q j Q_j Qj 不等于 0 0 0

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

  • 输入
    2 2 2 行,每行是一个加数。每个加数的长度不超过 100 100 100
  • 输出
    一行,即相应的和。输出保证一定是一个小数部分不为 0 0 0 的实数。
  • 样例输入
    0.111111111111111111111111111111
    0.111111111111111111111111111111
    
  • 样例输出
    0.222222222222222222222222222222
    

思路分析

此题考查高精度加法,在二级考题中,难度稍高。

借鉴大整数加法的思路,我们需要用字符串输入数据,然后将个位对齐,再进行加法运算,最后输出。在涉及到实数时,同样需要将个位对齐,这里可以将小数点对齐。

由于实数的小数点不像大整数的个位那么容易对齐,可以采取在翻转后的字符串前面补 0 0 0 的方式将小数点对齐。在加法运算过程中为了避免小数点参与运算导致错误的进位,需要跳过存储小数点的位,当然也可以在字符转数值的过程中进行。最后输出时同样需要注意小数点。

/*
 * Name: T5.cpp
 * Problem: 实数加法
 * Author: Teacher Gao.
 * Date&Time: 2024/11/16 00:07
 *            2024/12/01 16:17 Modified
 */

#include 
#include 
#include 

using namespace std;

int main()
{
	string s1, s2;
	int a[205] = {0}, b[205] = {0}, c[205] = {0};
	cin >> s1 >> s2;

	// 对齐小数点
	reverse(s1.begin(), s1.end());
	reverse(s2.begin(), s2.end());
	int p1 = s1.find('.'), p2 = s2.find('.'), p = max(p1, p2);
	s1 = string(p - p1, '0') + s1;
	s2 = string(p - p2, '0') + s2;

	// 字符转数值
	for (int i = 0; i < s1.size(); i++) a[i] = s1[i] - '0';
	for (int i = 0; i < s2.size(); i++) b[i] = s2[i] - '0';

	// 加法运算
	int x = 0, n = max(s1.size(), s2.size());
	for (int i = 0; i < n; i++) {
		if (i == p) continue;
		c[i] = a[i] + b[i] + x;
		x = c[i] / 10;
		c[i] %= 10;
	}
	if (x) c[n++] = x;

	// 去除末尾多余的 0
	int t = 0;
	while (t < p && !c[t]) t++;
	
	for (int i = n - 1; i >= t; i--) {
		if (i == p) cout << '.';
		else cout << c[i];
	}
    
	return 0;
} 

你可能感兴趣的:(青少年软编等考,C,语言题解集(二级),c语言,c++,算法,开发语言,学习,青少年编程,题解)