高精度运算
众所周知,c++有一种变量叫int_64……
好吧NOI与CSP貌似不支持int_64的样子
高精度加法
思想
将两个加数作为
具体过程
高精度乘法
for(int i=0;i<la;i++){
for(int j=0;j<lb;j++){
f=x[i]*y[j]; //f:记录结果
jw=f/10; //jw:记录进位
f%=10;
w=i+j; //精髓:w:每次数组的下标
//这里可以参考竖式乘法,i位与j位相乘应存储在i+j位
z[w]+=f;
z[w+1]+=jw+z[w]/10;//处理进位
z[w]%=10;
}
}
完整代码
#include<bits/stdc++.h>
using namespace std;
long long la,lb,lc,x[20010],y[20010],z[20010],w,jw,f; //注意数据大小
char a[20010],b[20010];
int main(){
scanf("%s",a);
scanf("%s",b);
la=strlen(a);
lb=strlen(b);
memset(x,0,sizeof(x));
memset(y,0,sizeof(y));
memset(z,0,sizeof(z));
for(int i=0;i<la;i++) x[la-i-1]=a[i]-'0';
for(int i=0;i<lb;i++) y[lb-i-1]=b[i]-'0';
for(int i=0;i<la;i++){
for(int j=0;j<lb;j++){
f=x[i]*y[j]; //f:记录结果
jw=f/10; //jw:记录进位
f%=10;
w=i+j; //w:每次数组的下标
z[w]+=f;
z[w+1]+=jw+z[w]/10;//处理进位
z[w]%=10;
}
}
lc=la+lb;
while(z[lc]==0) lc--;
if(lc<0) printf("%d",0);
else{
for(int i=lc;i>=0;i--) printf("%lld",z[i]);
}
return 0;
}