c语言如何实现大数乘法?来看看最强牛逼逼...

c语言如何实现大数乘法?来看看最强牛逼逼无敌悍将程序员是怎么解决的

```c
#include<stdio.h>
#include<stdlib.h>
//方法一,时间换空间(内存安全,稳定,速度跟方法二差不多)
char*BigTimes(char*m,char*n){
int i,z,x,y,s;
char*j=(char*)calloc(999,sizeof(char));
for(x=0;m[x];++x)
for(y=0;n[y];++y){
j[x+y]+=(m[x]-0x30)*(n[y]-0x30);
if(j[x+y]<0){
j[x+y-1]+=(j[x+y]+0x100)/10;
j[x+y]=(j[x+y]+0x100)%10;
}
}
for(i=z=x+y-1;i>0;){
if(j[--i]<0){
s=j[i]+0x100;j[i-1]+=s/10;j[i]=s%10;
}
if(j[i]<10){ j[i]+=0x30;continue; }
if(i>0)j[i-1]+=j[i]/10;else{y=0,x=j[i]/10;}
j[i]%=10;j[i]+=0x30;
}
if(!y){j[z+1]=0;while(z--)j[z+1]=j[z];j[0]=x+48;}
return j;
}
//方法二,空间换时间(额外开辟了一个int数组)
char*BigTimes1(char*m,char*n){
int i=0,l=0,z=0,x=0,y=0;
char*j=(char*)calloc(999,sizeof(char));
int r[999]={0};
while(m[++i]);while(n[++l]);z+=i+l-1;
while(x<i){
y=0;
while(y<l){
r[x+y]+=(m[i-x-1]-0x30)*(n[l-y-1]-0x30);
if(r[x+y]>9){
r[x+y+1]+=r[x+y]/10;r[x+y]%=10;
if(x+y+1==z)++z;
}++y;
}++x;
}
j[z+1]=0;i=0;
while(z--)j[i++]=r[z]+0x30;
return j;
}
int main(){
char m[499],n[499];scanf('%s %s',m,n);
char*r=BigTimes(m,n);//为什么用内存安全呢,虽慢了五分之一,自己细酌吧
printf('%s',r);free(r);
return 0;

(0)

相关推荐