字符串乘法
给定两个以字符串形式表示的非负整数 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;}
测试结果如下: