字符串乘法

字符串乘法

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

说明:

  • num1 和num2 的长度小于110。 num1 和 num2 只包含数字 0-9。
  • num1 和 num2 均不以零开头,除非是数字 0 本身。
  • 不能使用任何标准库的大数类型(比如BigInteger)或直接将输入转换为整数来处理。

对于数num1从个位开始依次与num2相乘然后求和。算法和手工计算乘法一样没什么特别的地方。
以12 * 23 为例,计算过程如下:
2 * 23 = 46
(1 * 23)*10 = 230 //考虑进位,加法也一样
46 + 230 = 276

public String multiply(String num1, String num2) {
        //任意一个数为零
        if("0".equals(num1) || num2.equals("0")){
            return "0";
        }
        String sum = "";
        for (int i = num1.length() - 1; i >= 0; i--) {
            String[] tmpSum = new String[num2.length() + 1];
            String a = num1.substring(i, i + 1);
            if(a.equals("0")){
                continue;
            }
            for (int j = num2.length() - 1; j >= 0; j--) {
                String b = num2.substring(j, j + 1);
                int tmpSunNum = tmpSum[j + 1] == null ? 0 : Integer.valueOf(tmpSum[j + 1]);
                int t = Integer.valueOf(a) * Integer.valueOf(b) + tmpSunNum;
                if (t >= 10) {
                    tmpSum[j + 1] = String.valueOf(t).substring(1, 2);
                    tmpSum[j] = String.valueOf(t).substring(0, 1);
                } else {
                    tmpSum[j + 1] = String.valueOf(t).substring(0, 1);
                }

            }
            //数组转为数字字符串
            String strSum = "";
            for (String s : tmpSum) {
                if (s != null)
                    strSum += s;
            }
            for (int x = 0; x < num1.length() - 1 - i; x++) {
                strSum += "0";
            }
            sum = add(sum, strSum);
        }
        return sum;
    }

    /**
     * 字符串之和
     * @param num1
     * @param num2
     * @return
     */
    private String add(String num1, String num2) {
        int maxlen = Math.max(num1.length(), num2.length());
        String[] charList = new String[maxlen + 1];
        
        for (int i = 0; i < maxlen; i++) {
            String num1i = null, num2i = null, sumi = charList[i];
            if (num1.length() - i - 1 >= 0)
                num1i = num1.substring(num1.length() - i - 1, num1.length() - i);
            if (num2.length() - i - 1 >= 0)
                num2i = num2.substring(num2.length() - i - 1, num2.length() - i);
            if (num1i == null)
                num1i = "0";
            if (num2i == null)
                num2i = "0";
            if (sumi == null)
                sumi = "0";
            int sum = Integer.valueOf(num1i) + Integer.valueOf(num2i) + Integer.valueOf(sumi);
            if (sum >= 10) {
                //进位
                charList[i] = String.valueOf(sum).substring(1, 2);
                charList[i + 1] = String.valueOf(sum).substring(0, 1);
            } else {
                charList[i] = String.valueOf(sum).substring(0, 1);
            }
        }
        String result = "";
        for (int i = charList.length - 1; i >= 0; i--) {
            if (charList[i] != null)
                result += charList[i];
        }
        return result;
    }

测试结果如下:

猜你喜欢

转载自www.cnblogs.com/YangLin2510/p/10032914.html