算法核心
通过数组表示数字,来大范围地扩充可表示的数值范围
理解
高精度:普通的int、long、long long类型无法满足的数字范围,如11111111111111111111111111111111111111远超普通的数字类型范围,这时候就需要用到高精度
用途
完美解决因数字过大而导致的数值溢出问题
加法核心
a—加数1【由a1,a2,a3....翻转表示,例如数字123就表示为321】
b—加数2【由b1,b2,b3....翻转表示,例如数字456就表示为654】
c—和【由c1,c2,c3....翻转表示】
i—数组下标数
①c[i]+=a[i]+b[i]
②c[i+1]=c[i]/10【起到进位的作用】
③c[i]=c[i]%10【留余】
代码实现
#include <bits/stdc++.h>
using namespace std;
const int num=1e5;
char ca[num],cb[num];
int a[num],b[num];
void demo(char n1[],char n2[]){
int len1=strlen(n1),len2=strlen(n2);
int c[num];
int len=len1>len2?len1+1:len2+1;//两数之和的位数最多为较大数位数加1
for(int i=1;i<=len1;++i){
a[i]=n1[len1-i]-'0';
}
for(int i=1;i<=len2;++i){
b[i]=n2[len2-i]-'0';
}
for(int i=1;i<=len;++i){
c[i]+=a[i]+b[i];
c[i+1]=c[i]/10;
c[i]=c[i]%10;
}
while(c[len]==0){//删除前导0
len--;
}
for(int i=len;i>0;--i){//转置输出和数组
cout<<c[i];
}
}
int main(){
cin>>ca>>cb;
demo(ca,cb);
return 0 ;
}
//测试数据1 000000001784697516584561854814863548156246100
//测试数据2 00000001458767164516745617800
//测试结果 1784697516584563313582028064901863900