大整数相乘算法
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;
}