题解 | #大数乘法#

大数乘法

http://www.nowcoder.com/practice/c4c488d4d40d4c4e9824c3650f7d5571



public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 
     * @param s string字符串 第一个整数
     * @param t string字符串 第二个整数
     * @return string字符串
     */
    public String solve (String s, String t) {
        // write code here
        // 判断不合法的输入
        if (s == null || s.length() == 0 || t == null || t.length() == 0) {
            return null;
        }
        // 如果有一个字符串为 0 ,结果就是 0
        if ("0".equals(s) || "0".equals(t)) {
            return "0";
        }
 
        // 最后相乘的结果,长度最多就是 2 个字符串的长度相加
        int[] num = new int[s.length() + t.length()];
 
        // num1 的每一个数字, 和 num2 的每一个数字相乘;  放到 num 数组的对应位置上
        for (int i = s.length() - 1; i >= 0; i--) {
            for (int j = t.length() - 1; j >= 0; j--) {
                // 同一个位置可能有多种情况映射过来, 所以结果位置上的结果取个累加和即可
                num[i + j + 1] += (s.charAt(i) - '0') * (t.charAt(j) - '0');
            }
        }
        // 如果最后的结果有进位,那么 num 数组的第一位数不为零;
        // 如果没进位,则为零。这种情况需要注意不要这个零。
        int end = 1;
        StringBuilder res = new StringBuilder();
        // 保存进位的值
        int carry = 0;
        // 从后往前遍历 num 数组,最后的结果有进位则遍历到 0 结束,没进位就遍历到 1 结束。
        for (int i = num.length - 1; i >= end; i--) {
            // 数组上对应位置的数 和 进位相加的结果
            int temp = num[i] + carry;
            res.append(temp % 10);
            carry = temp / 10;
        }
        // 最后的进位不为零,也是计算的结果,往前进 carry 位即可。
        if (carry != 0) {
            res.append(carry);
        }
 
        // 根据上述的流程,把 res 倒序一下,就是最后 2 个字符串相乘的结果
        return res.reverse().toString();
    }
    
}
全部评论
大佬牛逼
点赞 回复 分享
发布于 2022-02-16 18:09

相关推荐

评论
9
1
分享
牛客网
牛客企业服务