高级农民
- 积分
- 2724
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2017-6-18
- 最后登录
- 1970-1-1
|
digits的中间状态可以超过9,但是for循环是从低位往高位走的,所以上一次超过9的部分在下一次循环中会进位
你在内部for循环的最后加一些输出就可以看出来过程了,比如这样:
- import java.util.Arrays;
- public class Main {
- public String multiply(String num1, String num2) {
- if (num1 == null || num2 == null) {
- return "0";
- }
- int[] digits = new int[num1.length() + num2.length()];
- for (int i = num1.length() - 1; i >= 0; i--) {
- for (int j = num2.length() - 1; j >= 0; j--) {
- int product = (num1.charAt(i) - '0') * (num2.charAt(j) - '0');
- int p1 = i + j;
- int p2 = i + j + 1;
- int sum = digits[p2] + product;
- digits[p1] += sum / 10;
- digits[p2] = sum % 10;
- System.out.println("i = " + i + ", j = " + j +
- ", p1 = " + p1 + ", p2 = " + p2 +
- ", digits = " + Arrays.toString(digits));
- System.out.println("--");
- }
- }
- StringBuilder sb = new StringBuilder();
- for (int i = 0; i < digits.length; i++) {
- if (!(digits[i] == 0 && sb.length() == 0)) {
- sb.append(digits[i]);
- }
- }
- return sb.length() == 0 ? "0" : sb.toString();
- }
-
- public static void main(String[] args) {
- System.out.println("Result = " + new Main().multiply("999", "99"));
- }
- }
复制代码
输出:
- i = 2, j = 1, p1 = 3, p2 = 4, digits = [0, 0, 0, 8, 1]
- --
- i = 2, j = 0, p1 = 2, p2 = 3, digits = [0, 0, 8, 9, 1]
- --
- i = 1, j = 1, p1 = 2, p2 = 3, digits = [0, 0, 17, 0, 1]
- --
- i = 1, j = 0, p1 = 1, p2 = 2, digits = [0, 9, 8, 0, 1]
- --
- i = 0, j = 1, p1 = 1, p2 = 2, digits = [0, 17, 9, 0, 1]
- --
- i = 0, j = 0, p1 = 0, p2 = 1, digits = [9, 8, 9, 0, 1]
- --
- Result = 98901
复制代码
可以看出循环过程中digits中至多有一个slot可能>=10,但下一次那个slot就会进位 |
|