问题分析
易得m位数乘以n位数最终的结果不会超过m+n位,所以申请res数组的空间大小为m+n。
将每一位数字倒序存储在数组中,易知对于res[]数组中的第n位,在不考虑进位的情况下,他的结果来源是 ,所以有res[i + j] = num1[ i ]*num2[ j ] +res[i + j]。注意:此时计算的结果数组也是倒序存放的。计算结果数组的每一位所存储的数组,最后统一处理进位。
代码实现
string big_muti1(const string &num1,const string &num2) {
int len1 = num1.size();
int len2 = num2.size();
int str_len = len1 + len2;
int* tmp1 = new int[len1];
int* tmp2 = new int[len2];
int* res = new int[str_len];
//初始化数组
for (int i = 0; i < len1; i++)
{
tmp1[i] = num1[len1 - i - 1] - '0';
}
for (int i = 0; i < len2; i++)
{
tmp2[i] = num2[len2 - i - 1] - '0';
}
for (int i = 0; i < str_len; i++)
{
res[i] = 0;
}
//处理进位
for (int i = 0; i < len1; i++)
{
for (int j = 0; j < len2; j++)
{
res[i + j] = tmp1[i] * tmp2[j] + res[i + j];
}
}
int flag = 0;
for (int i = 0; i < str_len; i++)
{
res[i] += flag;
if (res[i] > 9)
{
flag = res[i] / 10;
res[i] -= flag * 10;
}
else
{
flag = 0;
}
}
//字符串转化
string str_res = "";
for (int i = 0; i < str_len; i++)
{
str_res += res[i] + '0';
}
reverse(str_res.begin(), str_res.end());
delete[] tmp1, tmp2;
tmp1 = tmp2 = NULL;
int size = str_res.size();
//摘除最终结果前方多余的0
flag = 0;
while (size > 1)
{
if (str_res[flag] > '0')
{
break;
}
size--;
flag++;
}
return str_res.substr(flag);
}
在倒序数组转为字符串时,可能会出现前几位都为0的情况,所以需要摘除前几位多余的0。