我们先来看题
题目描述
求两个不超过200位的非负整数的和。
输入
有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。
输出
一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。
样例输入1 复制
22222222222222222222
33333333333333333333
样例输出1 复制
55555555555555555555
重试
复制
这个问题可以通过将两个大整数从最低位开始逐位相加,并将进位加到下一位来解决。下面是解决这个问题的一般步骤:
- 创建两个字符串来存储两个大整数,并从输入中读取这两个字符串。
- 创建一个字符串来存储相加的结果。
- 创建两个指针,分别指向两个大整数的最低位。
- 创建一个变量来存储进位的值,初始值为0。
- 从最低位开始,逐位相加两个大整数,并将进位加到下一位。
- 如果一个大整数的位数比另一个大整数多,将多出的位数加到结果中。
- 如果最高位的进位不为0,将进位加到结果的最高位。
- 反转结果字符串,去除多余的前导0,并输出结果。
这是一个大整数相加的一般解决方案。
有了思路我们开始写code
#include<bits/stdc++.h>
using namespace std;
string a, b; // 用于存储输入的两个大整数
int num1[10010], num2[10010], len, res[10010], jw = 0; // num1, num2 用于存储两个大整数的每一位数字,res 用于存储相加的结果,jw 用于存储进位
int main() {
// 读取两个大整数
cin >> a >> b;
// 计算两个大整数的最大长度
len = max(a.size(), b.size());
// 将大整数的每一位数字存储到数组中,个位存储在数组的最低位
for (int i = 0; i < a.size(); i++) {
num1[i] = a[a.size() - 1 - i] - '0';
}
for (int i = 0; i < b.size(); i++) {
num2[i] = b[b.size() - 1 - i] - '0';
}
// 逐位相加两个大整数
for (int i = 0; i < len; i++) {
int ans = num1[i] + num2[i] + jw; // 当前位相加结果
jw = ans / 10; // 计算进位
res[i] = ans % 10; // 当前位的结果
}
// 处理最高位的进位
if (jw > 0) {
res[len] = jw; // 将进位加到结果中
len++;
}
// 输出相加的结果
for (int i = len - 1; i >= 0; i--) {
cout << res[i];
}
return 0;
}