2023 年 5 月青少年软编等考 C 语言二级真题解析
T1. 数字放大
此题为 2021 年 6 月二级第一题原题,见 2021 年 6 月青少年软编等考 C 语言二级真题解析中的 T1。
T2. 单词倒排
此题为 2020 年 9 月二级第一题原题,见 2020 年 9 月青少年软编等考 C 语言二级真题解析中的 T1。
T3. 计算矩阵边缘元素之和
输入一个整数矩阵,计算位于矩阵边缘的元素之和。所谓矩阵边缘的元素,就是第一行和最后一行的元素以及第一列和最后一列的元素。
时间限制: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 <iostream>
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. 奇数单增序列
此题为 2020 年 12 月二级第四题原题,见 2020 年 12 月青少年软编等考 C 语言二级真题解析中的 T4。
T5. 实数加法
求两个实数相加的和。
题目中输入输出里出现的浮点数都有如下的形式: 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
*/
#include <iostream>
#include <string>
#include <algorithm>
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;
for (int i = n - 1; i >= 0; i--) {
if (i == p) cout << '.';
else cout << c[i];
}
return 0;
}
原文地址:https://blog.csdn.net/qq_39710484/article/details/136779430
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!