正如我们所知道的,c语言中不管是long 还是longlong 其精度始终是有限的,所以在计算大数的时候很容易就会发生算法溢出问题,所以在面对大数计算的时候我们就只能采取用数组进行模拟的方式来进行计算
首先是大数加法
void add(char *a,char *b){
int i=0,j=0;
int lena=strlen(a);
int lenb=strlen(b);
for(i=0,j=lena-1;i<lena;i++,j--)tmpa[i]=a[j]-'0';// 将两个字符串转置
for(i=0,j=lenb-1;i<lenb;i++,j--) tmpb[i]=b[j]-'0';
int tmp=0,c=0;
for(i=0,j=0;i<lena || i<lenb;i++){ //模拟计算
tmp=tmpa[i]+tmpb[i]+c;
num[j]=tmp%10;
c=tmp/10;
j++;
}
if(c)num[j]=c;
i=maxn;
while(!num[i]){ i--;}
while(i>=0){cout<<num[i];i--;}
cout<<endl;
}
这是大数的减法
void sub(char *a,char *b){
int ok=0;
if(strcmp(a,b)<0){char *tmp=a;a=b;b=tmp;ok=1;} //假如a比b小的话就交换a,b并且标志输出应该为负
int i=0,j=0;<span style="font-family: Arial, Helvetica, sans-serif;">int lena=strlen(a),lenb=strlen(b);</span>
for(i=0,j=lena-1;i<lena;i++,j--) tmpa[i]=a[j]-'0';
for(i=0,j=lenb-1;i<lenb;i++,j--) tmpb[i]=b[j]-'0';
for(i=0;i<lena;i++){
if(tmpa[i]<tmpb[i]) {
tmpa[i]+=10,tmpa[i+1]--;
}
num[i]=tmpa[i]-tmpb[i];
}
if(ok) cout<<"-";
while(!num[i])i--;
while(i>=0) {cout<<num[i];i--;}
cout<<endl;
}
这是阶乘的模拟计算
void calc(int x){
int i=0,j=0;
int tmp=1;
int tmp1=0;
a[0]=1;
for(i=1;i<=x;i++){ //模拟计算
for(j=0;j<maxn;j++){
tmp=i*a[j]+tmp1;
tmp1=tmp/10;
a[j]=tmp%10;
}
}
i=maxn;
while(!a[i])i--;
while(i>=0)cout<<a[i--];
cout<<endl;
}
这是大数的乘法
for(i=0;i<len1;i++){
for(j=0;j<len2;j++){
sum[i+j]+=tmp1[i]*tmp2[j]; //tmp1[],tmp2[],是输入的两个数
sum[i+j+1]+=sum[i+j]/10;
sum[i+j]=sum[i+j]%10;
}
}
未完待更。。。