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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值