目录
第一种:实现字符串的乘法算法,乘法算法通过实现字符串的加法完成。
第二种:利用乘法公式,把num1,num2的每个位相乘的结果放到在数组对应的偏移位上,最终数组上的值就是相乘的结果。
字符串相乘是leetcode中的43题:https://leetcode-cn.com/problems/multiply-strings/
目前有2种解题思路 num1 * num2:
第一种:实现字符串的乘法算法,乘法内部通过实现字符串的加法计算。
例如 “123” * “45”,模拟乘法的算法,逐步拆分下面的公式:
(1)123 * 5 + 1230 * 4
(2)(123+123+123+123+123) + (1230+1230+1230+1230)
第二种:利用乘法公式,把num1,num2的每个位相乘的结果放到在数组对应的偏移位上,最终数组上的值就是相乘的结果。
num1的第i位和num2的第j位相乘的结果在乘积中的位置是 [i+j, i+j+1]
例如 “123” * “45”, 123的第3位 num1[2] = 3 和45的第2位 num2[1] = 5 乘积 15 存放在数组的 muls[3], muls[4]中
数组索引 0 1 2 3 4
num1 1 2 3
num2 4 5
---------
3*5 1 5
2*5 1 0
1*5 0 5
---------
3*4 1 2
2*4 0 8
1*4 0 4
---------
结果 0 5 5 3 5
第一种思路的代码实现:通过加法的方式实现乘法
public String multiply(String num1, String num2) {
if (num1 == null || num1.length() == 0 || num2 == null || num2.length() == 0) {
return "";
}
if (num1.equals("0") || num2.equals("0")) {
return "0";
}
//执行加法:当乘数num2只有一位数的时候
if (num2.length() == 1) {
String r = "0";
for (int i = 1; i <= num2.charAt(0) - '0'; i++) {
r = add(r, num1);
}
return r;
}
String tmp = num1;
String r = "0";
//把num2从低位到高位分别拿出来,各自乘以尾部添加对应“0”的num1
for (int i = num2.length() - 1; i >= 0; i--) {
r = add(r, multiply(tmp, num2.substring(i, i + 1)));
tmp += "0";
}
return r;
}
String add(String num1, String num2) {
int inx1 = num1.length() - 1;
int inx2 = num2.length() - 1;
char[] ca1 = num1.toCharArray();
char[] ca2 = num2.toCharArray();
String r = "";
//进位值
int carry = 0;
while (inx1 >= 0 || inx2 >= 0) {
int tmp = carry;
if (inx1 >= 0) {
tmp += (ca1[inx1--] - '0');
}
if (inx2 >= 0) {
tmp += (ca2[inx2--] - '0');
}
carry = tmp > 9 ? 1 : 0;
r = tmp % 10 + r;
}
if (carry == 1) {
r = carry + r;
}
return r;
}
第二种思路的代码实现:通过每位相乘的方式实现乘法
public String multiply(String num1, String num2) {
if(num1 == null || num1.length()==0 || num2==null||num2.length()==0){
return "";
}
if(num1.equals("0") || num2.equals("0")){
return "0";
}
int inx1 = num1.length()-1;
int inx2 = num2.length()-1;
int[] muls = new int[num1.length()+num2.length()];
for(int i=inx1;i>=0;i--){
for(int j=inx2;j>=0;j--){
int mul = (num1.charAt(i)-'0') * (num2.charAt(j)-'0');
mul += muls[i+j+1];
muls[i+j+1] = mul%10;
muls[i+j] += mul/10;
}
}
int start = 0;
while(start<muls.length&&muls[start]==0){
start++;
}
String r = "";
while(start<muls.length){
r += muls[start++];
}
return r;
}