解决长位数相乘的问题。
解决方法是模拟手工计算乘法,即数列式相乘。在计算时,先不处理进位,将结果储存在一个数组中,待全部计算完成后,做一次进位处理。
基本思想如下:
1 2 3
* 4 5 6
-------------
6 12 18
5 10 15
4 8 12
-----------------
res (4)(13)(28)(27)(18)
首先用字符串num1,num2储存两个大数,然后创建一个结果数组res,其大小为两数位数相加的和。两数相乘的结果位数一定是小于等于两数长度和的。
将两数反转后,可知num1中第i个数与num2中第j个数相乘后,应该放入结果数组res中的第i+j的位置。
代码如下:
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
int i,j;
string num1,num2;
while(cin>>num1>>num2)
{
int k=num1.size()+num2.size();
int p[k] = {0};
reverse(num1.begin(),num1.end());
reverse(num2.begin(),num2.end());
for(i=0;i<num1.size();i++)
for(j=0;j<num1.size();j++)
{
p[i+j] += (num1[i]-'0') * (num2[j] - '0');
}
int add=0;
for(i=0;i<k;i++)
{
int temp = p[i];
p[i] = (p[i] + add)%10;
add = (temp + add)/10;
}
int flag=1;
for(i=k-1;i>=0;i--)
{
if(flag && p[i]==0)
continue;
else
{
flag = 0;
cout<<p[i];
}
}
cout<<endl;
}
return 0;
}