题目:
给定两个以字符串形式表示的非负整数 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)或直接将输入转换为整数来处理。
解题思路:
1、我自己做的是用比较普通的方法做的,也就是咱们熟知的竖式计算
主要注意两方面:
注意乘法和加法的进位问题
乘法运算时注意第二个字符串中除最后一位与第一个字符串相乘时要再末尾填0,以便后面的加法运算
2、看了题解,有第二种方法运算,挺简单的
主要利用:一个n位数与一个m位数相乘,最多能够得到m+n位数的结果(在最前面有进位的情况则得到的是m+n位数,否则得到的就是m+n-1位数)
比如两个小于10的数相乘最多能得到两位数(就算得到了一个数也可以在前面填一个0补位)
本人代码:
class Solution {
public:
string multiply(string num1, string num2) {
if(num1[0] == '0' || num2[0] == '0') return "0" ;
string s ;
int l = num2.length() - 1 ;
s = mul(num1, num2[l]);
int i = 1 ;
l -=1 ;
while(l >= 0){
string s1 = mul(num1,num2[l]) ;
s1.append(i,'0') ;
i ++ ;
s = add(s, s1) ;
l -- ;
}
return s ;
}
string reverse(string &s) //字符串逆置
{
int i, j;
for (i = 0, j = s.size() - 1; i < j; ++i, --j)
{
swap(s[i], s[j]);
}
return s ;
}
string mul(string num1, char num) { //字符串与字符相乘
string s = "";
int l = num1.length() - 1 ;
int bit = 0;
while(l >= 0){
s.push_back(((num1[l] - 48)*(num - 48) + bit) % 10 + 48) ;
bit = int((num1[l] - 48)*(num - 48) + bit) / 10 ;
l-- ;
}
if(bit != 0)
s.push_back(bit + 48) ;
return reverse(s);
}
string add(string num1,string num2){ //两个字符串相加
string s = "";
int l1 = num1.length() - 1 ;
int l2 = num2.length() - 1 ;
int bit = 0;
while(l1 >= 0 && l2 >=0){
s.push_back((num1[l1] + num2[l2] + bit -96) % 10 + 48) ;
bit = (num1[l1] + num2[l2] + bit -96) / 10 ;
l1 --;
l2 --;
}
while(l1 >= 0){
s.push_back((num1[l1] + bit - 48) % 10 + 48) ;
bit = (num1[l1] + bit - 48) / 10 ;
l1 -- ;
}
while(l2 >= 0){
s.push_back((num2[l2] + bit - 48) % 10 + 48) ;
bit = (num2[l2] + bit - 48) / 10 ;
l2 -- ;
}
if(bit != 0)
s.push_back(bit + 48);
return reverse(s);
}
};