题目描述:
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
示例 1:
输入: num1 = "2", num2 = "3"
输出: "6"
示例 2:
输入: num1 = "123", num2 = "456"
输出: "56088"
说明:
-
num1 和 num2 的长度小于110。
-
num1 和 num2 只包含数字 0-9。
-
num1 和 num2 均不以零开头,除非是数字 0 本身。
-
不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理
代码实现:
class Solution {
public:
string multiply(string num1, string num2) {
string str;
if(num1[0] == '0' || num2[0] == '0') //如果有一个为0则返回0
{
str.push_back('0');
return str;
}
//将num1,num2反转,反转以后低位在前高位在后便于计算
reverse(num1.begin(), num1.end());
reverse(num2.begin(), num2.end());
int result[220] = {0}; //存放相乘的结果,因为num1和num2的长度小于110所以相乘结果小于220
int carry = 0; //用来存放进位
int num, i , j, k;
//两层for循环让num1中每一位与num2中每一位相乘
for (i = 0; i < num1.size(); ++i)
{
for (j = 0; j < num2.size(); ++j)
{
num = (num1[i] - '0')*(num2[j] - '0'); //num1当前位于num2当前位相乘的结果
result[i + j] += num; //num1的第i为与num2的第j位相乘的结果放在result中第i+j位(比如十位i为1,乘百位j为3,结果为放在千位[i+j]为4)
}
}
int len = i + j;//用来计算result的位数
for (k = 0; k < len; ++k)
{
result[k] += carry; //result中当前位的值+carry进位的值
carry = result[k] / 10; //除10的结果就是往更高为进位的值,放入carry
str.push_back((result[k] % 10) + '0'); //模10就是当前位向更高位进位以后的值,然后转字符放入str尾部
}
while (carry) //result中的每一位都向更高位进位以后,进位carry中的值不为0,则向更高位继续进位,直至carry为0
{
str.push_back((carry % 10) + '0');
carry = carry / 10;
}
while (str[str.size() - 1] == '0')//去掉str尾部多余的0,例如(2*4 的str中值为80)
{
str.pop_back();
}
reverse(str.begin(), str.end()); //将str反转
return str;
}
};
LeetCode--字符串相乘OJ--https://leetcode-cn.com/problems/multiply-strings/