好吧,这次没错又是我,一位吃螃蟹的人、以及编程领域优质创作者,极客爱好者。
#include<stdio.h>
#include<stdlib.h>
char*bigMul(const char*m,const char*n){
if(m[0]==0||n[0]==0)return NULL;//检验参数是否非空
//其实可以交给调用的函数判断,只要第一次传入两个时不为空,
//那么后面递归的时候是不需要判断的。这里加上是为了严谨。
int i=0,z=0,x,y,a,b,f,t;
char*j=(char*)calloc(999,sizeof(char));
//a,b是关于传入的m,n正负号是否存在,f表示结果的正负
a=m[0]=='-';b=n[0]=='-';f=a&&!b||!a&&b;
//开始递归计算,从非负的那一位开始,后面的呢是硬算的逻辑
for(x=a;m[x];++x)
for(y=b;n[y];++y){
t=x+y+f-a-b;
j[t]+=(m[x]-0x30)*(n[y]-0x30);
if(j[t]<0) j[t-1]+=(j[t]+0x100)/10,j[t]=(j[t]+0x100)%10;
}
//循环处理进位
for(i=z=x+y+f-a-b-1;i>f;){
if(j[--i]<0) t=j[i]+0x100,j[i-1]+=t/10,j[i]=t%10;
if(j[i]<10){ j[i]+=0x30;continue; }
if(i>f)j[i-1]+=j[i]/10;else y=0,x=j[i]/10;
j[i]%=10;j[i]+=0x30;
}
if(f) j[0]=0x2d;//判断是否是正负,如果是的话,那么第一个字符为负号
if(!y){t=f+1;j[z+t]=0;while(z--)j[z+t]=j[z+f];j[f]=x+0x30;}//判断进位,如果没有进位,那么从最后一位开始,全部左移一位
return j;
}
int main(){
char m[499],n[499];//初始化变量
scanf("%s %s",m,n);//录入
char*j=bigMul(m,n);//计算
printf("[%s]",j);//打印
free(j);//回收
return 0;
}