有些时候,在处理很大的数字运算时,我们会用到高精度,但是,一个int本来是可以存21亿的,但我们只用了1位,浪费了大量的空间,那么我们怎么解决这个问题呢?
这时,我们就要用到一个巧妙的方法——压位高精度,即在一个格子里存2位或两位以上的数据。下面我们用乘法来举一下例子
#include<bits/stdc++.h>
using namespace std;
const int MAXN=80005;
char a[MAXN],b[MAXN];
long long shu1[MAXN],shu2[MAXN],ans[MAXN];
int main()
{
scanf("%s",a);
scanf("%s",b);
int la=strlen(a),
lb=strlen(b);
int wei1=0,x=0;
for(int i=la-1; i>=0; i--)
{
x++;
shu1[wei1]/=10;
shu1[wei1]+=(a[i]-'0')*10000000;
if(x==8){
wei1++;
x=0;
}
}
while(x%8){
shu1[wei1]/=10;
x++;
}
int wei2=0;
x=0;
for(int i=lb-1; i>=0; i--)
{
x++;
shu2[wei2]/=10;
shu2[wei2]+=(b[i]-'0')*10000000;
if(x==8){
wei2++;
x=0;
}
}
while(x%8){
shu2[wei2]/=10;
x++;
}
for(int i=0;i<=wei1;i++)
for(int j=0;j<=wei2;j++){
ans[i+j]+=shu1[i]*shu2[j];
long long rest=ans[i+j]/100000000;
ans[i+j]%=100000000;
int wei=1;
while(rest){
ans[i+j+wei]+=rest;
rest=ans[i+j+wei]/100000000;
ans[i+j+wei]%=100000000;
wei++;
}
}
bool flag1=false,
flag2=false;
for(int i=MAXN; i>=0; i--){
if(ans[i]!=0) flag1=true;
if(flag2){
printf("%08lld",ans[i]);
}
else if(flag1){
printf("%lld",ans[i]);
flag2=true;
}
}
return 0;
}
可以发现,我们在代码中不再是到10就进位,而是在一个long long里存下8位数字(这里用long long是因为8位乘8位会超过int)。但这里要注意了(敲黑板),输出时我们需要进行补位,也就是当我们想要输出的是1 00000001是,压位高精度中存储的是两个1。当然不能让他输出两个1啊,所以就要补位。
这就是压位高精度的实现方法