題目:
字符串相乘
解法:
模擬手算乘法的過(guò)程, 首先, 我先把字符串計(jì)算結(jié)果從個(gè)位十位百位的從左往右排列, 計(jì)算完然后輸出字符串的時(shí)候又從右往左遍歷.
public String multiply(String num1, String num2) {
// num1乘以num2不會(huì)超過(guò)他們兩個(gè)的長(zhǎng)度
int len1 = num1.length();
int len2 = num2.length();
// 個(gè)位, 十位, 百位...
int[] result = new int[len1 + len2];
for (int i = len1 - 1; i >= 0; i--) {
for (int j = len2 - 1; j >= 0; j--) {
int n1 = num1.charAt(i) - '0';
int n2 = num2.charAt(j) - '0';
// 需要倒轉(zhuǎn)一下,保持 個(gè)位, 十位, 百位這樣的順序
result[len1 + len2 - 2 - (i + j)] += n1 * n2;
}
}
// 所得的結(jié)果需要進(jìn)位, 從個(gè)位開(kāi)始加
int carry = 0;
for (int i = 0; i < result.length; i++) {
result[i] += carry;
// 求進(jìn)位
carry = result[i] / 10;
// 得數(shù)位上的數(shù)
result[i] = result[i] % 10;
}
// 轉(zhuǎn)化成字符串
StringBuilder sb = new StringBuilder();
boolean initFlag = true;
for (int i = result.length - 1; i >= 0; i--) {
// 從高位向低位append
if ((initFlag == true) && (result[i] == 0)) {
continue;
}
initFlag = false;
sb.append(result[i]);
}
return sb.length() == 0 ? "0" : sb.toString();
}