大数乘法
大一上做过没做出来,一个月前写的不对,今天写出来了
// 模拟竖式运算 func multiply(num1 string, num2 string) string { var ans []byte // 结果,ans[i]是一个[0..9]的数,并且结果是逆序的 zeroCount := 0 for i := len(num2)-1; i >= 0; i-- { var tmp []byte // num2[i] * num1 的结果 // 填充"0", for k := 0; k < zeroCount; k++ { tmp = append(tmp, 0) } // 计算 num2[i] * num1 x := num2[i] - '0' var carry byte for j := len(num1)-1; j >= 0; j-- { y := num1[j] - '0' tmp = append(tmp, (x * y + carry) % 10) carry = (x * y + carry) / 10 } if carry != 0 { tmp = append(tmp, carry) } // ans += tmp if ans != nil { var carry, a, t byte for k := 0; (k < len(ans) || carry != 0) && k < len(tmp); k++ { t = tmp[k] if k < len(ans) {a = ans[k]} else {a = 0} tmp[k] = (t + a + carry) % 10 carry = (t + a + carry) / 10 } if carry != 0 { tmp = append(tmp, carry) } } ans = tmp zeroCount++ } allZero := true // 是否为0,特殊情况处理 // 反转 for L, R := 0, len(ans)-1; L <= R; L, R = L+1, R-1 { ans[L], ans[R] = ans[R] + '0', ans[L] + '0' if ans[L] != '0' || ans[R] != '0' { allZero = false } } if allZero { return "0" } return string(ans) }