对于加法学过编程的都知道,不过如果数据非常的大,大到无法用long long 这个数据类型储存,,特别是在这个大数据时代,这样的情况时有发生。这个时候就需要高精度算法来解决。
其实也很简单,首先,既然普通的数据类型不够大,那么我们干脆用数组来存储,这样就解决了数据溢出的问题。其次,要怎么进行计算呢?就是用小学学加法时候的笔算用代码表示出来。比如小学计算947+34=?这个问题时:
如此,只要数组足够大,多大的数据我也可以计算出来。
#include <iostream>
#include <cstring>
using namespace std;
int A[100000],B[100000],C[10000000],temp=0,lena,lenb,lenc;
char a[1000000],b[10000000];//因为数组太大尽量都定义在main函数外面。
int main(){
cin>>a;
cin>>b;
lena=strlen(a) ;//计算长度
lenb=strlen(b);
for(int i=0;i<lena;++i)
A[i]=a[lena-1-i]-'0';
/*
将字符数组变成整数数组,并且将数组倒转。
为什么要倒转呢?
因为一开始输入时,高位在前,只有倒转以后才可以做到低位在前 。
例如输入100,200;
在a,b中存储时100,200;
倒转以后在A,B中就时001,002;
方便计算
*/
for(int i=0;i<lenb;++i)
B[i]=b[lenb-1-i]-'0';
lenc=lena>lenb?lena:lenb;//得到较长的一个数
for(int i=0;i<lenc;++i)
{
C[i]=A[i]+B[i]+temp;
temp=C[i]/10;
C[i]%=10;
}
if(temp!=0)//看最后是否temp为0。并进行分类处理
{
C[lenc]=temp;
for(int i=lenc;i>=0;--i)
cout<<C[i];
return 0;
}
for(int i=lenc-1;i>=0;--i)//先输出高位 c
cout<<C[i];
return 0;
}
https://www.luogu.com.cn/problem/P1601
高精度加法,相当于a+b problem,不用考虑负数.
分两行输入。a,b≤10500a,b \leq 10^{500}a,b≤10500
输出只有一行,代表a+b的值
1
1
输出 #1
2
输入 #2
1001
9099
输出 #2
101
因篇幅问题不能全部显示,请点此查看更多更全内容