题目
给定两个正整数(不含前导 0),计算它们的和。
输入格式
共两行,每行包含一个整数。
输出格式
共一行,包含所求的和。
数据范围
1≤整数长度≤100000
输入样例:
1223
输出样例:
35
来源:acwing算法基础 791. 高精度加法
思路(注意事项)
用数组存储每个数字
纯代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
string a, b,ans;
cin >> a;
cin >> b;
int as = a.size(), bs = b.size(), t = 0, n = (as > bs)? as : bs;
vector<int> num1(n + 1), num2(n + 1), sum(n + 1);
for (int i = 0; i < as; i ++ ) num1[i] = a[as - i - 1] - '0';
for (int i = 0; i < bs; i ++ ) num2[i] = b[bs - i - 1] - '0';
for (int i = 0; i < n + 1; i ++ )
{
if (num1[i] + num2[i] + t < 10)
{
sum[i] = num1[i] + num2[i] + t;
t = 0;
}
else
{
sum[i] = num1[i] + num2[i] + t - 10;
t = 1;
}
}
if (sum[n] != 0) ans += to_string(sum[n]);
for (int i = n - 1; i >= 0; i --) ans += to_string(sum[i]);
cout << ans;
return 0;
}
题解(带注释)
#include<bits/stdc++.h>
using namespace std;
int main()
{
// 定义三个字符串,a 和 b 用于存储输入的两个大整数,ans 用于存储最终的计算结果
string a, b, ans;
// 从标准输入读取两个大整数,分别存储到字符串 a 和 b 中
cin >> a;
cin >> b;
// 计算字符串 a 和 b 的长度
int as = a.size(), bs = b.size();
// 初始化进位标志 t 为 0
int t = 0;
// 找出 a 和 b 中长度较长的那个,作为后续计算的最大长度
int n = (as > bs)? as : bs;
// 定义三个向量,num1 和 num2 分别用于存储字符串 a 和 b 转换后的数字,sum 用于存储相加的结果
vector<int> num1(n + 1), num2(n + 1), sum(n + 1);
// 将字符串 a 逆序存储到向量 num1 中,方便后续从低位到高位进行加法运算
for (int i = 0; i < as; i++)
num1[i] = a[as - i - 1] - '0';
// 将字符串 b 逆序存储到向量 num2 中,方便后续从低位到高位进行加法运算
for (int i = 0; i < bs; i++)
num2[i] = b[bs - i - 1] - '0';
// 从低位到高位进行逐位相加
for (int i = 0; i < n + 1; i++)
{
// 如果当前位相加再加上进位小于 10
if (num1[i] + num2[i] + t < 10)
{
// 当前位的和直接存储到 sum 向量中
sum[i] = num1[i] + num2[i] + t;
// 进位标志置为 0
t = 0;
}
else
{
// 当前位的和减去 10 后存储到 sum 向量中
sum[i] = num1[i] + num2[i] + t - 10;
// 进位标志置为 1
t = 1;
}
}
// 如果最高位有进位(即 sum[n] 不为 0),将其添加到结果字符串 ans 中
if (sum[n] != 0)
ans += to_string(sum[n]);
// 从次高位开始,将 sum 向量中的数字依次添加到结果字符串 ans 中
for (int i = n - 1; i >= 0; i--)
ans += to_string(sum[i]);
// 输出最终的计算结果
cout << ans;
return 0;
}