正在载入在线练习界面,本页内容可直接阅读…
AK CSP › CSP-J 2026 第一轮真题 › 第 27 题
CSP-J 2026 第一轮 第 27 题:程序(二):假设输入的两个数均为 n 位正整数(不含前导零)
题目
#include <algorithm>
#include <iostream>
#include <string>
using namespace std;
int a[100007], b[100007], c[100007], carry[100007];
string input_str;
int a_len, b_len;
int main() {
cin >> input_str;
a_len = input_str.size();
for (int i = 0; i < a_len; i++) {
a[i] = input_str[a_len - i - 1] - '0';
}
cin >> input_str;
b_len = input_str.size();
for (int i = 0; i < b_len; i++) {
b[i] = input_str[b_len - i - 1] - '0';
}
carry[0] = 0;
for (int i = 0; i < max(a_len, b_len) + 1; i++) {
c[i] = a[i] + b[i] + carry[i];
if (c[i] >= 10) {
carry[i + 1] = 1;
c[i] -= 10;
} else {
carry[i + 1] = 0;
}
}
for (int i = max(a_len, b_len); i >= 0; i--) {
cout << c[i];
}
cout << endl;
return 0;
}
本题输入的两个数均为非负整数,位数不超过 100000,可能包含前导零。本小题
假设输入的两个数均为 $n$ 位正整数(不含前导零),且它们的和小于 $10^{n}$,则程序输出的字符串一定满足( )。选项
- A. 第一个字符一定不为 '0'
- B. 长度一定为 $n$
- C. 长度一定为 $n + 1$,且第一个字符为 '0'
- D. 长度可能为 $n + 2$
答案
C
题解
答案选 C:长度一定为 \(n+1\),且第一个字符为 '0'。
两个输入都是 \(n\) 位数,因此 a_len = b_len = n。关键看输出循环:
``cpp for (int i = n; i >= 0; i--) { cout << c[i]; } ``
它依次输出 c[n]、c[n-1]、…、c[0],一共 \(n+1\) 个数字。
为什么第一个数字 c[n] 是 0?
a、b是全局数组,初始值全部为0。输入只填入下标0到n-1,所以a[n] = b[n] = 0。- 两数之和小于 \(10^n\),说明最高位相加后没有向第 \(n+1\) 位进位,即
carry[n] = 0。 - 因此
c[n] = a[n] + b[n] + carry[n] = 0。
例如输入 12 和 34,程序输出的是 046,而不是 46。原因就是输出时没有去掉多余的前导零。
真题版权归 CCF 所有,本站仅用于非商业教学用途。页面加载后可直接在线作答,作答记录保存在本浏览器或账号中。 京ICP备2026056990号-1
京公网安备11010502062986号