两个字符串从尾遍历然后转数字相乘相加 用%一位一位算

为了计算两个字符串形式的大数相乘,可以采用模拟手算乘法的方式,从尾部开始逐位相乘并累加,处理进位。以下是如何实现这种方法的详细步骤:

1. **初始化**:
   - 将两个字符串表示的数字反转,以便从最低位(个位)开始相乘。
   - 创建一个长度为 `len(num1) + len(num2)` 的数组 `result`,用于存储相乘的中间结果。

2. **逐位相乘并累加**:
   - 对于 `num1` 和 `num2` 的每一位,分别取出对应的数值进行相乘,并将结果加到 `result` 的相应位置上。
   - 处理每一位相乘时,需要考虑进位问题,将当前位的结果加到数组的当前位置,同时处理好进位累加到下一位。

3. **处理进位**:
   - 遍历 `result` 数组,处理每个位置的进位,使得每个位置只存储一位数。

4. **结果转换**:
   - 去掉 `result` 中前导的零,并将结果转换为字符串形式。

5. **特殊情况处理**:
   - 如果乘积为零(例如输入中有一个数字为零),直接返回 "0"。

以下是这个算法的实现代码示例:

### Java实现代码

```java
public class BigNumberMultiplication {
    public String multiply(String num1, String num2) {
        if (num1.equals("0") || num2.equals("0")) {
            return "0"; // 特殊情况处理
        }

        int len1 = num1.length();
        int len2 = num2.length();
        int[] result = new int[len1 + len2];

        // 反转字符串以方便从个位开始相乘
        for (int i = len1 - 1; i >= 0; i--) {
            int n1 = num1.charAt(i) - '0';
            for (int j = len2 - 1; j >= 0; j--) {
                int n2 = num2.charAt(j) - '0';
                int sum = (n1 * n2) + result[i + j + 1]; // 计算当前位的乘积加上之前的结果
                result[i + j + 1] = sum % 10; // 当前位保留个位
                result[i + j] += sum / 10; // 进位
            }
        }

        // 构建结果字符串,跳过前导零
        StringBuilder sb = new StringBuilder();
        for (int num : result) {
            if (sb.length() != 0 || num != 0) { // 跳过前导零
                sb.append(num);
            }
        }

        return sb.toString();
    }
}
```

### 详细步骤解析

1. **反转字符串并初始化结果数组**:
   - 反转 `num1` 和 `num2`,以便从个位开始相乘。
   - 初始化 `result` 数组的长度为 `len1 + len2`,确保足够存放乘积的每一位。

2. **相乘累加**:
   - 对于 `num1` 的每一位 `n1` 和 `num2` 的每一位 `n2`,计算 `n1 * n2` 的结果并加到 `result[i + j + 1]`,同时处理进位。

3. **处理进位**:
   - 使用 `sum / 10` 计算进位,并加到 `result[i + j]`。
   - 使用 `sum % 10` 计算当前位的值并存储在 `result[i + j + 1]`。

4. **构建结果**:
   - 将 `result` 数组转换为字符串,跳过前导零。

5. **特殊情况**:
   - 如果 `num1` 或 `num2` 为 "0",直接返回 "0"。

这种方法避免了大数运算的复杂性,通过数组处理乘法进位和累加,实现了有效的大数相乘。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值