难度:中等
给定两个以字符串形式表示的非负整数 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)或直接将输入转换为整数来处理。
题目分析:
直接按照竖式乘法的形式想成,相加就完事了。主要是要考虑转换成int型。程序都有注释
参考代码:
#include <iostream>
#include <vector>
#include <string>
#include <unordered_map>
#include <deque>
#include <stack>
#include <algorithm>
#include <map>
using namespace std;
//主要是将字符串转换成数字,但是只转换一个数字(全部转换的话必定会溢出int)
class Solution {
public:
string multiply(string num1, string num2) {
bool flag = true;
string res;
//如果其中一个数为0,那么不需要乘,直接返回0
if (num1[0] == '0' || num2[0] == '0')
return "0";
//需要考虑符号
if (num1[0] == '-' && num2[0] != '-' ||
num1[0] != '-' && num2[0] == '-')
flag = false;
string temp; //因为相乘之后的存储是方向的,所以弄一个temp
int mult_num1;//num1中的某一位数
int mult_num2;//num2中的某一位数
int carry = 0;//乘法进位
int z = 0; //结果中从第z位开始相加
temp.resize(num1.size() + num2.size());//初始化内存
for (int i = num1.size()-1; i >= 0; --i)
{
//考虑符号情况就直接返回了
if (num1[i] == '-')
break;
mult_num1 = num1[i] - '0'; //转换num1中的某一位数
z = num1.size() - 1 - i; //temp是从左到右存储的
for (int j = num2.size() - 1; j >= 0; --j)
{
//考虑符号情况就直接返回了
if (num2[j] == '-')
break;
mult_num2 = num2[j] - '0'; //转换num2中的某一位数
carry += mult_num1 * mult_num2; //carry累加一下乘法结果(又是进位,又是积和)
int temp_carry = carry % 10; //相加的时候也要考虑进位的问题(carry中的个位)
int temp_z; //原来和中对应的那一位
if (temp[z] != '\0')
temp_z = temp[z] - '0'; //不为空的话,就转换成int型的数,以便相加
else
temp_z = 0; //为空的话,说明是第一次,为0
int sum = temp_carry + temp_z; //求出相加的和
temp[z] = sum % 10 + '0'; //先放入个位
carry /= 10; //删掉个位
carry += sum / 10; //留下十位,是进位
++z; //记得z++,从下一位开始相加
}
//计算到最后,如果carry不为0,那就在转换成字符加入字符串
if (carry != 0)
{
temp[z] = carry % 10 + '0';
carry = 0;
}
}
//判断是否要添加符号
if (!flag)
res.push_back('-');
//从后往前存储就完事了
for (int k = temp.size()-1; k >= 0; --k)
{
//要注意的是如果有符号,最后两位可能是‘\0’
if (temp[k] != '\0')
res.push_back(temp[k]);
}
return res;
}
};
int main()
{
Solution solution;
string num1 = "-56789019";
string num2 = "0";
cout << solution.multiply(num1, num2) << endl;
system("pause");
return 0;
}
参考代码:(上面考虑了符号)
class Solution {
public:
string multiply(string num1, string num2) {
if(num1[0] == '0' || num2[0] == '0')
return "0";
string res(max(num1.size()*num2.size(),num1.size()+num2.size()),'0');
int w_index = -1;
int temp = 0;
for(int i = num2.size()-1; i >= 0; i--)
{
w_index = num2.size()- 1 - i;
for(int j = num1.size() - 1; j >= 0; j--)
{
int data1 = num1[j] - '0';
int data2 = num2[i] - '0';
temp += data1*data2;
temp += (res[w_index] - '0');
res[w_index] = temp%10 + '0';
temp /= 10;
w_index++;
}
if(temp != 0)
{
res[w_index] = temp + '0';
temp = 0;
}
}
if(res[w_index] == '0')
w_index--;
string res_str;
for(int i = w_index; i >= 0; i--)
{
res_str.push_back(res[i]);
}
return res_str;
}
};