题目描述
给定两个以字符串形式表示的非负整数
num1
和num2
,返回num1
和num2
的乘积,它们的乘积也表示为字符串形式。
示例1
输入: num1 = "2", num2 = "3" 输出: "6"
示例2
输入: num1 = "123", num2 = "456" 输出: "56088"
思路
拆分,拆分成第一个数的每一位与第二个数相乘,然后将所有相乘的结果相加,实现过程还可优化。注意最后结果前面的数字可能出现0,需要去掉。
实现
string multiData(char a, string data, int len) {
string res = "";
int flag = 0;
int cur = 0;
for (int i = data.length() - 1; i >= 0; i--)
{
int temp = ((a - '0') * (data[i] - '0')) + flag;
flag = temp / 10;
cur = temp % 10;
res += (cur + '0');
}
if (flag > 0)
{
res += (flag + '0');
}
reverse(res.begin(), res.end());
for (int i = 0; i < len; i++)
{
res += '0';
}
return res;
}
string addData(string data1, string data2) {
int len1 = data1.length();
int len2 = data2.length();
if (len1 < len2)
{
for (int i = 0; i < len2 - len1; i++)
{
data1 = '0' + data1;
}
} else {
for (int i = 0; i < len1 - len2; i++)
{
data2 = '0' + data2;
}
}
int flag = 0;
int cur = 0;
string res = "";
for (int i = data1.length() - 1; i >= 0; i--)
{
int temp = data1[i] + data2[i] - '0' - '0' + flag;
flag = temp / 10;
cur = temp % 10;
res += (cur + '0');
}
if (flag > 0)
{
res += (flag + '0');
}
reverse(res.begin(), res.end());
return res;
}
string multiply(string num1, string num2) {
int len1 = num1.length();
int len2 = num2.length();
string res = "";
for (int i = 0; i < len1; i++)
{
string data = multiData(num1[i], num2, len1 - i - 1);
res = addData(res, data);
}
int index = 0;
while (index < res.length() && res[index] == '0')
{
index++;
}
if (index < res.length())
{
res = res.substr(index);
} else {
res = "0";
}
return res;
}