算法解析之大数乘法

        我们知道,计算机存储的数值是有位宽限制的,比如char占一个字节,int占四个字节(先不考虑平台限制了)。总之一个数值总是有长度限制的。可我们在科学数值计算中,就会出现问题,比如一个位数为128位的数*一个位数为128位的数,先不说乘法的结果放在什么样的类型中长度是合适的。但就操作数本身而言,就没有数据结构来存。我们的思想是:利用字符串来存,每个操作数中一个数占一个字符。源码如下:

int main()
{
     string num1,num2;     // 初始状态用string来存储大数
     cout<<"现在,来两个大数吧! "<<endl;
     cin>>num1>>num2;

     const char *p1=num1.c_str();    //将string转为 const char *
     const char *p2=num2.c_str();    //将string转为 const char *
     multiply(p1,p2);

     return 0;
}

void multiply(const char *a,const char *b)
{
      int i,j,ca,cb,*s;

      ca=strlen(a);
      cb=strlen(b);

      s=(int *)malloc(sizeof(int)*(ca+cb));   //分配存储空间,两数相乘,结果最长为两数位数的长度和

      for(i=0;i<ca+cb;i++)
    	  s[i]=0;      // 每个元素赋初值0

      for(i=0;i<ca;i++)
          for (j=0;j<cb;j++)
              s[i+j+1]+=(a[i]-'0')*(b[j]-'0');

      for(i=ca+cb-1;i>=0;i--)        // 这里实现进位操作
          if (s[i]>=10)
          {
              s[i-1]+=s[i]/10;
              s[i]%=10;
          }

      char *c=(char *)malloc((ca+cb)*sizeof(char));  //分配字符数组空间,因为它比int数组省!

      i=0;
      while(s[i]==0) i++;   // 跳过头部0元素

      for(j=0;i<ca+cb;i++,j++)
    	  c[j]=s[i]+'0';

      c[j]='\0';

      for(i=0;i<ca+cb;i++)
    	  cout<<c[i];

      cout<<endl;
      free(s);
}
        下面给出上面的算法过程,手工模拟一下:

        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值