题目描述
高精度加法,相当于 a+b problem,不用考虑负数。
输入格式
分两行输入。a,b≤10500。
输出格式
输出只有一行,代表 a+b 的值。
输入输出样例
输入
1
1
输出
2
输入
1001
9099
输出
10100
说明/提示
20% 的测试数据,0≤a,b≤109;
40% 的测试数据,0≤a,b≤1018。
代码
无注释版
#include<bits/stdc++.h>
using namespace std;
char a[10010],b[10010];
int p[10010],q[10010],s[10010];
int main(){
memset(p,0,sizeof(p));
memset(q,0,sizeof(q));
memset(s,0,sizeof(s));
cin>>a>>b;
int n=strlen(a);
int m=strlen(b);
for(int i=0;i<n;i++) p[n-i]=a[i]-'0';
for(int i=0;i<m;i++) q[m-i]=b[i]-'0';
int x=0,len=1;
while(len<=n||len<=m){
s[len]=p[len]+q[len]+x;
x=s[len]/10;
s[len]%=10;
len++;
}
s[len]=x;
if(s[len]==0){
len--;
}
for(int i=len;i>=1;i--){
cout<<s[i];
}
}
有注释版
#include<bits/stdc++.h>
using namespace std;
char a[10010], b[10010]; // 用于存储两个大数的字符串形式
int p[10010], q[10010], s[10010]; // 用于存储两个大数的数字形式和结果
int main() {
memset(p, 0, sizeof(p)); // 初始化 p 数组,表示 a 的数字形式
memset(q, 0, sizeof(q)); // 初始化 q 数组,表示 b 的数字形式
memset(s, 0, sizeof(s)); // 初始化 s 数组,表示结果的数字形式
cin >> a >> b; // 输入两个大数 a 和 b 的字符串形式
int n = strlen(a); // 获取 a 的长度
int m = strlen(b); // 获取 b 的长度
// 将 a 转换为数字形式,p 数组存储 a 的每一位
for (int i = 0; i < n; i++) {
p[n - i] = a[i] - '0'; // 将字符转为数字,并按位存入 p 数组,注意反向存储
}
// 将 b 转换为数字形式,q 数组存储 b 的每一位
for (int i = 0; i < m; i++) {
q[m - i] = b[i] - '0'; // 同样的操作,将字符转为数字,并按位存入 q 数组,反向存储
}
int x = 0, len = 1; // x 用于存储进位,len 用于表示当前处理到的位数
// 开始逐位加法,直到处理完所有位
while (len <= n || len <= m) {
s[len] = p[len] + q[len] + x; // 当前位的和,加上进位
x = s[len] / 10; // 计算进位
s[len] %= 10; // 当前位的数字
len++; // 处理下一位
}
s[len] = x; // 最后一位可能还有进位
// 如果最后一位没有进位(即 s[len] 为 0),则结果的位数应该减少
if (s[len] == 0) {
len--;
}
// 输出结果
for (int i = len; i >= 1; i--) {
cout << s[i]; // 从最高位开始输出
}
return 0;
}