c语言 有符号大数乘法的char实现

#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;
}
经验分享 程序员 微信小程序 职场和发展