C++ 字符串相乘
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。
示例1
输入: num1 = "2", num2 = "3"
输出: "6"
示例2
输入: num1 = "123", num2 = "456"
输出: "56088"
提示:
- 1 <= num1.length, num2.length <= 200
- num1 和 num2 只能由数字组成。
- num1 和 num2 都不包含任何前导零,除了数字0本身。
思路/解法
使用字符串与字符串之间模拟整数与整数相乘。模拟法。
class Solution
{
public:
string multiply(string num1, string num2)
{
if (num1 == "0" || num2 == "0")
{
return "0";
}
string ans = "";
for (int i = num2.length() - 1; i >= 0; i--)
{
string res = ""; //例如,123*456,第一次res应为738
int front = 0; //记录每次进位的值,比如3*6,进位为1
for (int j = num1.length() - 1; j >= 0; j--)
{
int num = (num2[i] - 48) * (num1[j] - 48);
num += front;
res = to_string((char)(num % 10)) + res;
front = num / 10;
}
//最后一次front可能不为0
if (front != 0)
{
res = to_string(front) + res;
}
if (i == num2.length() - 1)
{
ans = res;
}
else
{
//第一次记录0738+6150。实际上是738和615,但是因为每次乘法都需前移一位,即需要在738前面补0,615后面补0。至于补充的0的数量,具有一定规律,可看下面代码。
for (int z = 0; z < num2.length() - 1 - i; z++)
{
res = res + "0";
}
int size = ans.length();
for (int z = 0; z < res.length() - size; z++)
{
ans = "0" + ans;
}
front = 0; //同上
string addStr = ""; //记录两数之和,比123*456,第一次记录0738+6150之和。
for (int z = ans.length() - 1; z >= 0; z--)
{
int num = (ans[z] - 48) + (res[z] - 48);
num += front;
addStr = to_string((char)(num % 10)) + addStr;
front = num / 10;
}
if (front != 0)
{
addStr = to_string(front) + addStr;
}
ans = addStr;
}
}
return ans;
}
};