LeetCode43. 字符串相乘

LeetCode43. 字符串相乘

题目描述

/**
     * 
     * 给定两个以字符串形式表示的非负整数 num1 和 num2,
     * 返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
     * 
     */

思路分析

  1. 使用两数竖式相乘的方法
  2. 分别遍历两个字符串的每一位,将每一位获取的字符转换为数字的值,然后将两个值进行相乘,考虑进位
  3. 将乘数的每一位和被乘数相乘的结果保存在StringBuffer中,然后将每次计算的结果相加
  4. 字符串的加法详解见上篇
  5. 实质就是模拟两个数字列竖式相乘
  6. 详解见下

源码及分析

public String multiply(String num1, String num2) {
        //数据校验
        if ("0".equals(num1) || "0".equals(num2)) {
            return "0";
        }
        //定义resStr 保存计算的结果
        String resStr = "0";
        //遍历乘数,将乘数的每一位与被乘数相乘,并记录每次相乘的结果
        //注意高位要补零
        for (int i = num2.length() - 1; i >= 0; i--) {
            //定义StringBuffer 保存乘数的每一位与被乘数计算的结果
            StringBuffer buffer = new StringBuffer();
            //定义变量carry保存每次相乘的进位
            int carry = 0;
            //保存num2当前位的值
            int x = i >= 0 ? num2.charAt(i) - '0' : 0;
            //遍历被乘数,将被乘数的每一位与乘数的每一位相乘
            for (int j = num1.length() - 1; j >= 0 || carry > 0; j--) {
                int y = j >= 0 ? num1.charAt(j) - '0' : 0;
                buffer.append((x * y + carry) % 10);
                carry = (x * y + carry) / 10;
            }
            buffer.reverse();
            //考虑补零的问题
            for (int j = i + 1; j < num2.length() ; j++) {
                buffer.append('0');
            }
            //调用两数相加的方法,将每次计算的结果相加
            resStr = addStrings2(resStr, buffer.toString());
        }
        return resStr;

    }
	
	//两个字符串相加的方法

    public String addStrings2(String num1, String num2) {
        //数据校验
        if ("0".equals(num1)) {
            return num2;
        }
        if ("0".equals(num2)) {
            return num1;
        }
        //定义StringBuffer保存两字符串相加后的值
        StringBuffer buffer = new StringBuffer();
        //定义carry保存两数相加后是否有进位
        int carry = 0;
        //定义i j 指针指向两字符串的最右侧索引
        int i = num1.length() - 1, j = num2.length() - 1;
        //将两数从个数开始依次相加,考虑进位,如果两数长度不相等,则高位补0
        while (i >= 0 || j >= 0 || carry != 0) {
            //考虑两数长度不相同的情况,定义 x y保存对应位上的数字大小
            int x = i >= 0 ? num1.charAt(i) - '0' : 0;
            int y = j >= 0 ? num2.charAt(j) - '0' : 0;
            int res = x + y + carry;
            buffer.append(res % 10);
            carry = res / 10;
            i--;
            j--;
        }
        return buffer.reverse().toString();
    }
posted @ 2021-05-28 10:39  mx_info  阅读(85)  评论(0)    收藏  举报