字符串相乘
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
示例 1:
输入: num1 = “2”, num2 = “3”
输出: “6”
代码:
class Solution
{
public:
string addStrings(string num1, string num2)
{
int len1 = num1.size();
int len2 = num2.size();
if (len1 > len2)
{
swap(len1, len2);
num1.swap(num2);
}
string ret;
ret.reserve(len2 + 2);
int step = 0;
int j = len2 - 1;
for (int i = len1 - 1; j >= 0; i--, j--)
{
int sum = 0;
if (i >= 0)
{
sum = (num1[i] - '0' + num2[j] - '0') + step;
}
else
sum = (num2[j] - '0') + step;
step = 0;
if (sum > 9)
{
step++;
sum = sum - 10;
}
ret.push_back(sum + '0');
}
if (step != 0)
{
ret.push_back(step + '0');
}
reverse(ret.begin(), ret.end());
return ret;
}
public:
string multiply(string num1, string num2)
{
int len1 = num1.size();
int len2 = num2.size();
string add;
add.reserve(len1 + len2+1);
if (num1[0] == '0' || num2[0] == '0')//1
{
add.push_back('0');
return add;
}
if (len1 < len2)
{
swap(len1, len2);
num1.swap(num2);
}
int j = len1 - 1;
int step = 0;
string* ret=new string[len2+1];
for (int i = 0; i < len2; i++)
{
ret[i].reserve(len1 + len2);
}
for (int i = 0; i < len2; i++)//2
{
for (; j >= 0; j--)
{
int sum = 0;
sum = (num1[j] - '0')*(num2[i] - '0') + step;
step = 0;
if (sum > 9)
{
step = sum / 10;
sum = sum % 10;
}
ret[i].push_back(sum + '0');
}
if (step != 0)
{
ret[i].push_back(step + '0');
step = 0;
}
reverse(ret[i].begin(), ret[i].end());
int count = len2 - 1;
while (count - i)//3
{
ret[i].push_back('0');
count--;
}
j = len1 - 1;
}
add = addStrings(ret[0], ret[1]);//4
for(int i=2;i<len2;i++)
add= addStrings(add, ret[i]);
delete[] ret;
return add;
}
};
虽然方法很烂,但是还是做出来了哈哈哈。
要注意的几点:
1.要注意两个数相乘,其中一个可能是0,如果没有特别处理,就会输出结果为多个0,比如
,999 * 0=000;不会通过;
2.用两个数中长度短的作为乘数,比如,123 * 45,用45做乘数,用123分别去乘乘数的每一位,得到的结果分别保存下来;
3.乘数有多少个长度,就给第一个结果添长度-1个0,第二个添长度-2个0;以此类推;
比如 123 * 45;
结果保存在ret[0]=“4920”,ret[1]=“615”,把结果相加就好;
4.申请len2+1个长度,避免出现2*3这种情况,如果申请len2个长度结果空间去保存,
这里只有一个结果空间ret[0],ret[1]就不存在,使用add = addStrings(ret[0], ret[1]);就会出错;