字符串乘法
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积, 它们的乘积也表示为字符串形式。
说明:
- num1 和num2 的长度小于110。 num1 和 num2 只包含数字 0-9。
- num1 和 num2 均不以零开头,除非是数字 0 本身。
- 不能使用任何标准库的大数类型(比如BigInteger)或直接将输入转换为整数来处理。
对于数num1从个位开始依次与num2相乘然后求和。算法和手工计算乘法一样没什么特别的地方。
以12 * 23 为例,计算过程如下:
2 * 23 = 46
(1 * 23)*10 = 230 //考虑进位,加法也一样
46 + 230 = 276
public String multiply(String num1, String num2) {
//任意一个数为零
if("0".equals(num1) || num2.equals("0")){
return "0";
}
String sum = "";
for (int i = num1.length() - 1; i >= 0; i--) {
String[] tmpSum = new String[num2.length() + 1];
String a = num1.substring(i, i + 1);
if(a.equals("0")){
continue;
}
for (int j = num2.length() - 1; j >= 0; j--) {
String b = num2.substring(j, j + 1);
int tmpSunNum = tmpSum[j + 1] == null ? 0 : Integer.valueOf(tmpSum[j + 1]);
int t = Integer.valueOf(a) * Integer.valueOf(b) + tmpSunNum;
if (t >= 10) {
tmpSum[j + 1] = String.valueOf(t).substring(1, 2);
tmpSum[j] = String.valueOf(t).substring(0, 1);
} else {
tmpSum[j + 1] = String.valueOf(t).substring(0, 1);
}
}
//数组转为数字字符串
String strSum = "";
for (String s : tmpSum) {
if (s != null)
strSum += s;
}
for (int x = 0; x < num1.length() - 1 - i; x++) {
strSum += "0";
}
sum = add(sum, strSum);
}
return sum;
}
/**
* 字符串之和
* @param num1
* @param num2
* @return
*/
private String add(String num1, String num2) {
int maxlen = Math.max(num1.length(), num2.length());
String[] charList = new String[maxlen + 1];
for (int i = 0; i < maxlen; i++) {
String num1i = null, num2i = null, sumi = charList[i];
if (num1.length() - i - 1 >= 0)
num1i = num1.substring(num1.length() - i - 1, num1.length() - i);
if (num2.length() - i - 1 >= 0)
num2i = num2.substring(num2.length() - i - 1, num2.length() - i);
if (num1i == null)
num1i = "0";
if (num2i == null)
num2i = "0";
if (sumi == null)
sumi = "0";
int sum = Integer.valueOf(num1i) + Integer.valueOf(num2i) + Integer.valueOf(sumi);
if (sum >= 10) {
//进位
charList[i] = String.valueOf(sum).substring(1, 2);
charList[i + 1] = String.valueOf(sum).substring(0, 1);
} else {
charList[i] = String.valueOf(sum).substring(0, 1);
}
}
String result = "";
for (int i = charList.length - 1; i >= 0; i--) {
if (charList[i] != null)
result += charList[i];
}
return result;
}
测试结果如下: