自学内容网 自学内容网

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)!