1 条题解
-
0
题意分析
题目要求计算多个超长整数(长度不超过位)的总和。由于普通数据类型无法存储这么大的数字,需要使用高精度计算方法来逐位相加。
- 输入:
- 最多行,每行一个非负整数(长度位)。
- 最后一行以表示输入结束。
- 输出:
- 所有输入整数的和(可能超过位)。
解题思路
- 高精度加法:
- 将每个数字的每一位存储在字符数组中。
- 从最低位开始逐位相加,并处理进位。
- 存储结果:
- 使用字符数组
result
存储最终的和,初始化为全。 - 每次读取一个数后,将其与
result
逐位相加。
- 使用字符数组
- 输出处理:
- 从最高位开始输出,忽略前导。
实现步骤
- 初始化:
result
数组初始化为个(预留足够空间)。
- 逐行读取输入:
- 对每个数字,从最低位开始与
result
对应位相加。 - 处理进位,并更新
result
。
- 对每个数字,从最低位开始与
- 输出结果:
- 从
result
的最高位开始扫描,找到第一个非位。 - 从该位开始反向输出所有数字。
- 从
C++实现
#include <cstdio> #include <cstring> char str[105]; // 存储当前输入的数字 char result[105]; // 存储累加结果 int main() { // 初始化result为全0 for (int i = 0; i < 105; ++i) result[i] = '0'; while (scanf("%s", str) != EOF) { if (str[0] == '0' && str[1] == '\0') break; // 遇到0结束输入 int len = strlen(str); int carry = 0; // 进位 int pos = 0; // 当前处理的位置 // 从最低位开始逐位相加 for (int i = len - 1; i >= 0; --i) { int temp = (str[i] - '0') + (result[pos] - '0') + carry; result[pos++] = (temp % 10) + '0'; // 更新当前位 carry = temp / 10; // 计算进位 } // 处理剩余的进位 while (carry != 0) { int temp = (result[pos] - '0') + carry; result[pos++] = (temp % 10) + '0'; carry = temp / 10; } } // 找到最高有效位 int pos = 104; while (pos >= 0 && result[pos] == '0') pos--; // 如果全0,输出0 if (pos == -1) { printf("0\n"); } else { // 反向输出结果 for (int i = pos; i >= 0; --i) printf("%c", result[i]); printf("\n"); } return 0; }
代码说明
- 输入处理:
- 使用
str
数组存储当前输入的数字。 - 遇到单独时终止输入。
- 使用
- 高精度加法:
- 从数字的最低位(
str[len-1]
)开始逐位相加。 - 进位
carry
初始为,每次相加后更新。
- 从数字的最低位(
- 结果输出:
- 从
result
数组的最高位()开始扫描,跳过前导。 - 反向输出有效数字位。
- 从
时间复杂度:,其中是数字个数,是数字的平均位数。
- 输入:
- 1
信息
- ID
- 504
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者