高精度运算
题单介绍
[代码](https://www.luogu.com.cn/paste/qn5bpvub)
由于在c++中,整数的最大类型为unsigned long long类型。它最大能表示$2^{64}-1$。但是有些时候,我们需要计算更大的整数,那ull就没法计算了。
之前我们学到怎么把一个十进制数一位一位分离。那能不能分离之后每一个变量存一位数,用一个数组来表示一个大整数呢。
很显然是可以的。但是随之而来的又是一个新的问题:c++帮我们实现了int类型和longlong类型的四则运算,但是它却不会两个数组之间的四则运算。那么两个大整数需要四则运算的时候该怎么办呢?
那只能我们自己动手去实现了。
我们用一个数组a来记录一个大整数。其中a[0]表示位数,a[1]表示个位,a[2]表示十位,……。以此类推。
```
大整数的读入:由于整数太长,所以不可能用int类型读。所以必须用字符串读完后再转移到大整数数组里
char s[100];
int a[100];
scanf("%s",s);
int len=strlen(s);
for(int i=0;i<len;i++)a[len-i]=s[i]-'0';
a[0]=len;
大整数的输出:
for(int i=a[0];i>=1;i--)printf("%d",a[i]);
大整数的加法:按位加完后再进位,最后判断是否有多一位
int c[100];//a与b的和存到c里面
int len=max(a[0],b[0]);
for(int i=1;i<=len;i++)c[i]=a[i]+b[i];
for(int i=1;i<=len;i++)
if(c[i]>=10){
c[i+1]++;
c[i]-=10;
}
}
if(c[len+1]>0)len++;
c[0]=len;
大整数的减法:减完后再借位,最后去掉前导零,至少留1位
int c[100];//a与b的和存到c里面
int len=max(a[0],b[0]);
for(int i=1;i<=len;i++)c[i]=a[i]-b[i];
for(int i=1;i<=len;i++)
if(c[i]<0){
c[i+1]--;
c[i]+=10;
}
}
while(len>1&&c[len]==0)len--;
c[0]=len;
大整数的乘法:
int c[200];//记得长度开两倍
int c[0]=a[0]+b[0]-1;
for(int i=1;i<=a[0];i++){
for(int j=1;j<=b[0];j++){
c[i+j-1]+=a[i]*b[j];
}
}
for(int i=1;i<=c[0];i++){
if(c[i]>=10){
c[i+1]+=c[i]/10;
c[i]%=10;
}
}
if(c[c[0]+1]>0)c[0]++;
大整数除以小整数:
int c[100],rest=0;
for(int i=a[0];i>=1;i--){
rest=rest*10+a[i];
c[i]=rest/b;
rest%=b;
}
c[0]=a[0];
while(c[0]>1&&c[c[0]]==0)c[0]--;
```