代码改变世界

大整数相乘算法

2009-10-05 20:26  Iron  阅读(532)  评论(0编辑  收藏  举报

解决思路:让两个乘数从最低位乘起,一位一位挪向高位,用双重循环,因为两个一位整数相乘的结果最多会产生两位的结果,所以把乘得得结果,分别加到结果数组的对应位上,对应位的确定采用思路如下:不管哪个乘数往高挪一位,结果在结果数组的对应位上会变化一位,具体前进还是后退,取决于你的算法(我的是前进一位),我的代码采用两个变量分别记录当前取得两个乘数的位置,需要用的时候进行组合,这样也方便在双重循环时,开始另一次运算时,重置另一个乘数的位置

//程序代码

#include <iostream>
using namespace std;
int main()
{
 char a[] = "28898989234345234523444444434";//乘数1
 char b[] = "99";      //乘数2
 int *res = new int[_countof(a)+_countof(b)-2];
 int x = _msize(res)/sizeof(int);
 memset(res,0,_msize(res));
 
 int index = 0;//起始位数
 int indexa = 0;//被乘数位数
 int indexb = 0;//乘数位数
 for (int i=_countof(a)-2; i >= 0; --i)
 {
  int ax = a[i]-'0';
  //乘数的位数重新开始计数
  indexb = 0;
  for(int j=_countof(b)-2; j >= 0; --j)
  {
   int bx = b[j]-'0';
   int tempres = ax*bx;//一位相乘的结果
   //个位
   int tempres1 = tempres%10;
   //十位
   int tempres2 = tempres/10;
   index = indexa+ indexb;//当前结果所应加的位置
   res[index] += tempres1;
   res[index+1] += tempres2;
   for (int k=0;k<_countof(a);k++)
   {
    if (res[k]>9)
    {
     res[k+1] += res[k]/10;
     res[k] = res[k]%10;
    }
    else
    {
     //如果index+1后还没有益处,则不会溢出,终止循环
     if (k>index)
     {
      break;
     }
    }
   }
   indexb++;
  }
  indexa++;
 }
 for (int i=_msize(res)/sizeof(int)-1;i>=0;i--)
 {
  cout << res[i];
 }
 cout << endl;
}