题意描述:
给定两个以字符串形式表示的非负整数 num1
和 num2
,返回 num1
和 num2
的乘积,它们的乘积也表示为字符串形式。
说明:
- num1 和 num2 的长度小于110。
- num1 和 num2 只包含数字 0-9。
- num1 和 num2 均不以零开头,除非是数字 0 本身。
- 不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。
示例:
示例一:
输入: num1 = "2", num2 = "3"
输出: "6"
示例二:
输入: num1 = "123", num2 = "456"
输出: "56088"
解题思路:
代码:
Python 方法一: 一行代码。
class Solution:
def multiply(self, num1, num2):
"""
:type num1: str
:type num2: str
:rtype: str
"""
return str(int(num1) * int(num2))
Python 方法二: 大数乘法
class Solution:
def multiply(self, num1: str, num2: str) -> str:
self.ans = [0 for x in range(300)]
self.firstNumIndex = 0
for x in range(len(num1)-1, -1, -1):
tmp = [0] * (len(num1)-1-x)
carry = 0
for y in range(len(num2)-1, -1, -1):
last = (int(num1[x]) * int(num2[y]) + carry) % 10;
carry = (int(num1[x]) * int(num2[y]) + carry) // 10;
tmp.append(last)
if carry > 0:
tmp.append(carry)
#print("tmp ", tmp)
self.add(tmp)
#print(self.ans);
startIndex = self.firstNumIndex
while self.ans[startIndex] == 0 and startIndex > 0:
startIndex -= 1
return ''.join([str(x) for x in self.ans[:startIndex+1][::-1]])
def add(self, tmp):
carry = 0
for x in range(len(tmp)):
last = (self.ans[x] + tmp[x] + carry) % 10;
carry = (self.ans[x] + tmp[x] + carry) // 10;
self.ans[x] = last
self.firstNumIndex = x
if carry > 0:
self.ans[len(tmp)] = carry;
self.firstNumIndex = len(tmp)
return
Java 方法二:大数乘法
class Solution {
int[] ans = new int[300];
int firstNumIndex = 0;
public String multiply(String num1, String num2) {
List<Integer> tmp = new ArrayList();
for(int i=num1.length()-1; i>=0; --i){
tmp.clear();
int cnt = num1.length()-1-i;
while(cnt > 0){
tmp.add(0);
cnt --;
}
int carry = 0;
int last = 0;
for(int j=num2.length()-1; j>=0; --j){
last = ((num1.charAt(i)-'0') * (num2.charAt(j)-'0') + carry) % 10;
carry = ((num1.charAt(i)-'0') * (num2.charAt(j)-'0') + carry) / 10;
tmp.add(last);
}
if(carry > 0){
tmp.add(carry);
}
this.add(tmp);
}
int startIndex = this.firstNumIndex;
while(this.ans[startIndex] == 0 && startIndex > 0){
startIndex --;
}
//StringBuilder ret = new StringBuilder("");
String ret = new String("");
while(startIndex >=0 ){
//System.out.print(this.ans[startIndex]);
//ret.append((char)this.ans[startIndex]);
ret += this.ans[startIndex];
startIndex --;
}
System.out.println();
//System.out.println(ret.toString());
return ret;
}
public void add(List<Integer> tmp){
// 将 tmp 加到 this.ans 上去
int last = 0;
int carry = 0;
for(int i=0; i<tmp.size(); ++i){
last = (this.ans[i] + tmp.get(i) + carry) % 10;
carry = (this.ans[i] + tmp.get(i) + carry) / 10;
this.ans[i] = last;
this.firstNumIndex = i;
}
if(carry > 0){
this.firstNumIndex++ ;
this.ans[this.firstNumIndex] = carry;
}
return;
}
}
易错点:
- 一些测试样例:
"123000000000000000123"
"456"
"10000000000000000000000000001"
"101"
"9999999999999999999999999"
"9999999999999999999999999"
"9133"
"0"
- 答案:
"56088000000000000056088"
"1010000000000000000000000000101"
"99999999999999999999999980000000000000000000000001"
"0"
总结:
- 大数加法,大数乘法都是入门题,掌握应该不难,而且是常见的题目,可以优化一下代码,然后记一下。