这道题的核心在于如何两个大数(整数型)如何相乘;
如果我们不考虑进位的问题,那么他的核心代码是:
假设a从低位到高位,b从低位到高位,那么s从低位到高位则如下:
for(int i=0;i<a.size();i++)
for(int j=0;j<b.size();j++)
{
s[i+j]+=a[i]*b[j];
}
但是事实上,a是从高位到低位,b也从高位到低位存储的,那么s也应从高位到低位存储。
我们也无需将a与b都倒置一下。直接按如下编码,mul(即s)直接从最低位开始填充
#include <iostream>
#include<string>
using namespace std;
void multiply(string a, string b)
{
int la = a.size();
int lb = b.size();
int lm = la + lb;//s的最大位数,两数相乘的积的最大位数为两数的位数和
string mul="";
mul.insert(mul.begin(), lm, '0');
for (int i = la - 1; i >= 0; i--)
for (int j = lb - 1, k = i + j + 1; j >= 0; j--, k--)
{
int temp = (mul[k] - '0') + (a[i] - '0')*(b[j] - '0');
mul[k] = temp % 10 + '0';
mul[k - 1] = (mul[k - 1] - '0') + temp / 10 + '0';
}
int num = 0;
int k = 0;
while (mul[k] == '0')
{
mul.erase(mul.begin());
}
cout<<mul;
}
void main()
{
string a = "1166";
string b = "22";
multiply(a, b);
system("pause");
}