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; }
上一篇:
JS实现多线程数据分片下载
下一篇:
chatgpt在银行领域的应用