题目描述
给定两个以字符串形式表示的非负整数 num1
和 num2
,返回 num1
和 num2
的乘积,它们的乘积也表示为字符串形式。
解题思路
这是一个“大数”题目,要用字符串来解决,模拟(竖式)乘法操作。(先做第415题:字符串相加)。
参考代码,简介优雅。(此题最重要的是要理清下标的问题,理解并记住)
python作弊解法:return str(int(num1) * int(num2));
。
参考代码
class Solution {
public:
string multiply(string num1, string num2) {
int length1 = num1.size();
int length2 = num2.size();
string res(length1 + length2, '0'); // 重要
for(int j = length2-1; j >= 0; j--){
for(int i = length1-1; i >= 0; i--){
int tmp = (res[i+j+1] - '0' ) + (num2[j] - '0') * (num1[i] - '0');
res[i+j+1] = tmp % 10 + '0';
res[i+j] += tmp/10; // 这里其实有可能 res[i+j] 所代表的数字大于'9',不过这对最终结果无影响。(比如举例:69*87 = 6003)
}
}
for(int i = 0; i < length1+length2; i++){
if(res[i] != '0')
return res.substr(i);
}
return "0";
}
};
当然,也可以这么做。(同上)
class Solution {
public String multiply(String num1, String num2) {
if (num1.equals("0") || num2.equals("0")) {
return "0";
}
int[] res = new int[num1.length() + num2.length()]; // 这里用了int,更好理解而已
for (int i = num1.length() - 1; i >= 0; i--) {
int n1 = num1.charAt(i) - '0';
for (int j = num2.length() - 1; j >= 0; j--) {
int n2 = num2.charAt(j) - '0';
int sum = (res[i + j + 1] + n1 * n2);
res[i + j + 1] = sum % 10;
res[i + j] += sum / 10;
}
}
StringBuilder result = new StringBuilder();
for (int i = 0; i < res.length; i++) {
if (i == 0 && res[i] == 0) continue;
result.append(res[i]);
}
return result.toString();
}
}