这篇文章是在学习高精度加法后的总结,大体上是学习的博客上大佬的思路,指路【模板+详解】 高精度加法 - dfydn - 博客园
方法一:模拟手工加法计算
#include<bits/stdc++.h>
using namespace std;
string a1,b1;
//lena和lenb用int就可以了,题目要求a,b<10^500,所以lena和lenb最大为500
int lena,lenb;
int m=0;
int main(){
cin>>a1>>b1;
lena=a1.length();
lenb=b1.length();
vector<int> a(lena,0),b(lenb,0);
//字符串存入数组,倒序
for(int i=0;i<lena;i++){
a[i]=a1[lena-i-1]-'0';
}
for(int i=0;i<lenb;i++){
b[i]=b1[lenb-i-1]-'0';
}
int lenc=max(lena,lenb);
vector<int> c(lenc+1);
for(int i=0;i<lenc;i++){
//如果a数组与b数组长度相同,可以直接这么用,否则要判断a数组和b数组的大小,否则可能短的那一个越界
//c[i]=(m+a[i]+b[i])%10;
//m=(m+a[i]+b[i])/10;
//下面是要判断a与b数组大小的类型
int sum = m; // 进位部分
if (i < lena) sum += a[i]; // 加上a数组的数字
if (i < lenb) sum += b[i]; // 加上b数组的数字
c[i] = sum % 10; // 当前位的结果
m = sum / 10; // 更新进位
}
if(m){
lenc++;
//这里第一次写成lenc了,忘记了数组下标减1
c[lenc-1]=1;
}
//倒序输出变为正序
for(int i=lenc-1;i>=0;i--){
cout<<c[i];
}
return 0;
}
方法二:先计算,后进位
#include<bits/stdc++.h>
using namespace std;
string a1,b1;
int lena,lenb;
int main(){
cin>>a1>>b1;
//存入数组
lena=a1.length();
lenb=b1.length();
vector<int> a(lena),b(lenb);
for(int i=0;i<lena;i++){
a[i]=a1[lena-1-i]-'0';
}
for(int i=0;i<lenb;i++){
b[i]=b1[lenb-1-i]-'0';
}
//先计算
int lenc=max(lena,lenb);
vector<int> c(lenc+1,0);
for(int i=0;i<lenc;i++){
if(i<lena) c[i]+=a[i];
if(i<lenb) c[i]+=b[i];
}
//后进位
for(int i=0;i<lenc;i++){
c[i+1]=c[i+1]+c[i]/10;
c[i]=c[i]%10;
}
if(c[lenc]){
lenc++;
}
//输出
for(int i=lenc-1;i>=0;i--){
cout<<c[i];
}
return 0;
}