c/c++语言 超大数乘法【完美实现】

179 阅读1分钟

本文已参与「新人创作礼」活动.一起开启掘金创作之路。

好吧,这次没错又是我,一位吃螃蟹的人、以及编程领域优质创作者,极客爱好者。

#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;
}