LeetCode43. 字符串相乘
题目描述
/**
*
* 给定两个以字符串形式表示的非负整数 num1 和 num2,
* 返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
*
*/
思路分析
- 使用两数竖式相乘的方法
- 分别遍历两个字符串的每一位,将每一位获取的字符转换为数字的值,然后将两个值进行相乘,考虑进位
- 将乘数的每一位和被乘数相乘的结果保存在StringBuffer中,然后将每次计算的结果相加
- 字符串的加法详解见上篇
- 实质就是模拟两个数字列竖式相乘
- 详解见下
源码及分析
public String multiply(String num1, String num2) {
//数据校验
if ("0".equals(num1) || "0".equals(num2)) {
return "0";
}
//定义resStr 保存计算的结果
String resStr = "0";
//遍历乘数,将乘数的每一位与被乘数相乘,并记录每次相乘的结果
//注意高位要补零
for (int i = num2.length() - 1; i >= 0; i--) {
//定义StringBuffer 保存乘数的每一位与被乘数计算的结果
StringBuffer buffer = new StringBuffer();
//定义变量carry保存每次相乘的进位
int carry = 0;
//保存num2当前位的值
int x = i >= 0 ? num2.charAt(i) - '0' : 0;
//遍历被乘数,将被乘数的每一位与乘数的每一位相乘
for (int j = num1.length() - 1; j >= 0 || carry > 0; j--) {
int y = j >= 0 ? num1.charAt(j) - '0' : 0;
buffer.append((x * y + carry) % 10);
carry = (x * y + carry) / 10;
}
buffer.reverse();
//考虑补零的问题
for (int j = i + 1; j < num2.length() ; j++) {
buffer.append('0');
}
//调用两数相加的方法,将每次计算的结果相加
resStr = addStrings2(resStr, buffer.toString());
}
return resStr;
}
//两个字符串相加的方法
public String addStrings2(String num1, String num2) {
//数据校验
if ("0".equals(num1)) {
return num2;
}
if ("0".equals(num2)) {
return num1;
}
//定义StringBuffer保存两字符串相加后的值
StringBuffer buffer = new StringBuffer();
//定义carry保存两数相加后是否有进位
int carry = 0;
//定义i j 指针指向两字符串的最右侧索引
int i = num1.length() - 1, j = num2.length() - 1;
//将两数从个数开始依次相加,考虑进位,如果两数长度不相等,则高位补0
while (i >= 0 || j >= 0 || carry != 0) {
//考虑两数长度不相同的情况,定义 x y保存对应位上的数字大小
int x = i >= 0 ? num1.charAt(i) - '0' : 0;
int y = j >= 0 ? num2.charAt(j) - '0' : 0;
int res = x + y + carry;
buffer.append(res % 10);
carry = res / 10;
i--;
j--;
}
return buffer.reverse().toString();
}