给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
示例 1:
输入: num1 = “2”, num2 = “3”
输出: “6”
示例 2:
输入: num1 = “123”, num2 = “456”
输出: “56088”
说明:
1).num1 和 num2 的长度小于110。
2)num1 和 num2 只包含数字 0-9。
3)num1 和 num2 均不以零开头,除非是数字 0 本身。
4)不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。
解答:类似于字符串计算的问题,一般都可以采用竖式计算来解决。
注意的要点有:
1)进位carry(尤其是最后一次进位)
2)num1与num2的每一位的乘法结果后要视情况补0
图片来自leetcode
class Solution {
public:
string multiply(string num1, string num2) {
if(num1 == "0" || num2 == "0") return "0";
string result = "";
//num2逐位与num1相乘
for(int i = num2.size() - 1; i >= 0; --i)
{
string temp = ""; //保留num2第i位与num1相乘的结果
//除了最后一位不需要在结果后补0,其余均需要补一定数量的0
for(int j = 0; j < num2.size() - 1 - i; ++j)
{
temp += "0";
}
int carry = 0; //进位
int n2 = num2[i] - '0';
//num2的第i位n2 与 num1相乘
for(int j = num1.size() - 1; j >= 0; --j)
{
int n1 = num1[j] - '0';
int product = n1 * n2 + carry; //每一位,乘积
carry = product / 10;
product = product % 10;
temp += to_string(product);
}
if(carry > 0) temp += to_string(carry); //注意,很容易错
reverse(temp.begin(), temp.end());
result = addStrings(temp, result);
}
return result;
}
string addStrings(string num1, string num2) //字符串相加
{
int i = num1.size() - 1;
int j = num2.size() - 1;
string result = "";
int carry = 0;
while(i >= 0 || j >= 0)
{
int n1 = i >= 0 ? num1[i] - '0' : 0;
int n2 = j >= 0 ? num2[j] - '0' : 0;
int temp = n1 + n2 + carry;
carry = temp / 10;
temp = temp % 10;
result += to_string(temp);
--i;
--j;
}
if(carry == 1) result += "1";
reverse(result.begin(), result.end());
return result;
}
};
这里涉及到字符串的加法(leetcode 415.字符串的加法)
解答:也是采用竖计算,使用两个“指针” i, j分别指向两个数字(位对齐)
要注意的是,长度小的字符串,在计算时,要在较小的字符串前面加0
class Solution {
public:
string addStrings(string num1, string num2) {
int i = num1.size() - 1; //指向num1
int j = num2.size() - 1; //指向num2
string result = "";
int carry = 0; //进位
while(i >= 0 || j >= 0)
{
//长度不够的字符串,前面补0
int n1 = i >= 0 ? num1[i] - '0' : 0;
int n2 = j >= 0 ? num2[j] - '0' : 0;
//std::cout << n1 << " " << n2 << endl;
int temp = n1 + n2 + carry; //每一位,求和
carry = temp / 10;
temp = temp % 10;
result += to_string(temp);
--i;
--j;
}
if(carry == 1) result += "1";
reverse(result.begin(), result.end());
return result;
}
};
来源:CSDN
作者:阁仔
链接:https://blog.csdn.net/baidu_23388287/article/details/104316224