Leetcode 字符串相乘

字符串相乘

题目描述:

给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。 说明:    num1 和 num2 的长度小于110。    num1 和 num2 只包含数字 0-9。    num1 和 num2 均不以零开头,除非是数字 0 本身。    不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。

题目链接

class Solution {
    public String multiply(String num1, String num2) {
        int len1 = num1.length(),len2 = num2.length();
        if(len1 == 1 && num1.charAt(0) == '0' || len2 == 1 && num2.charAt(0) == '0'){ // 特殊判断
            return "0";
        }
        if(len1 < len2){ // 标准
            String temp = num1;
            num1 = num2;
            num2 = temp;
            len1 = len2^len1;
            len2 = len2^len1;
            len1 = len2^len1;
        }
        String sum = "0";
        for(int i = len2 - 1 ; i>=0 ; i--){ // 对num2的每个十位数遍历
            // 求解积
            int carry = 0; // 积进位
            String temp = ""; // 每次求积后的临时字符串
            for(int j = len1 - 1 ; j>=0 ; j--){ // 对num1的每个十位数遍历
                int current = (int)(num2.charAt(i)-'0')*(num1.charAt(j)-'0') + carry;
                carry = current/10;
                temp = current%10 + temp;
            }
            if(carry > 0){ // 处理剩余进制问题
                temp = carry + temp;
            }
            // 求解和
            for(int k = i ; k<len2-1 ; k++){ // 进十位
                temp += "0";
            }
            String temp1;
            if(temp.length() > sum.length()){ // 标准
                temp1 = temp;
                temp = sum;
                sum = temp1;
            }
            carry = 0;// 和进位
            temp1 = "";// 每次求和的临时值
            for(int k = 0 ; k<temp.length() ; k++){
                int current = (int)(sum.charAt(sum.length() - k - 1)-'0'+temp.charAt(temp.length()- k - 1)-'0') + carry;
                carry = current/10;
                temp1 = current%10 + temp1;
            }
            String temp2 = sum.substring(0,sum.length() - temp.length()); // 和前缀
            if(carry > 0){ // 处理剩余进制问题
                String temp3 = "";
                for(int k = temp2.length()-1 ; k>=0 ; k--){
                    int current = (int)(temp2.charAt(k)-'0') + carry;
                    carry = current/10;
                    temp3 = current%10 + temp3;
                }
                if(carry > 0){ // 处理进制问题
                    temp3 = carry + temp3;
                }
                temp1 = temp3 + temp1;
            }else{
                temp1 = temp2 + temp1;
            }
            // 更新sum
            sum = temp1;
        }
        return sum;
    }
}

模拟手算过程即可,详细请看代码。

上一篇:五个砝码


下一篇:Linux创建快捷方式的几种方法