leetcode 43. 字符串相乘

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


 示例 1: 

 输入: num1 = "2", num2 = "3"

 输出: "6" 

示例 2: 

 输入: num1 = "123", num2 = "456" 

输出: "56088" 


说明:

 num1 和 num2 的长度小于110。

 num1 和 num2 只包含数字 0-9。 

num1 和 num2 均不以零开头,除非是数字 0 本身。

 不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。  


代码:

public String multiply(String num1, String num2) {
        if(num1.equals("0")||num2.equals("0"))
            return "0";
        if(num1.length()<num2.length())
            return multiply(num2,num1);
        String result = "0";
        for(int i=num2.length()-1,count=0;i>=0;--i,++count){
            String s = multi(num1,num2.charAt(i));
            for(int k=0;k<count;++k){
                s += '0';
            }
            result = add(result,s);
        }
        return result;
    }

    public String add(String one,String two){
        StringBuilder stringBuilder = new StringBuilder();
        int i = one.length()-1, k = two.length()-1;
        int in = 0;
        while (i>=0&&k>=0){
            int oneVaule = one.charAt(i)-'0';
            int twoVaule = two.charAt(k)-'0';
            int tmp = oneVaule+twoVaule+in;
            stringBuilder.insert(0,(char)((tmp%10)+'0'));
            in = tmp/10;
            --i;
            --k;
        }
        while (i>=0){
            int oneVaule = one.charAt(i)-'0';
            int tmp = oneVaule+in;
            stringBuilder.insert(0,(char)((tmp%10)+'0'));
            in = tmp/10;
            --i;
        }
        while (k>=0){
            int twoVaule = two.charAt(k)-'0';
            int tmp = twoVaule+in;
            stringBuilder.insert(0,(char)((tmp%10)+'0'));
            in = tmp/10;
            --k;
        }
        if(in!=0){
            stringBuilder.insert(0,in);
        }
        return stringBuilder.toString();
    }


    public String multi(String string ,char c){
        int k = c - '0';
        int in = 0;
        StringBuilder stringBuilder = new StringBuilder();
        for(int i=string.length()-1;i>=0;--i){
            int value = string.charAt(i) - '0';
            int tmp = value*k + in;
            stringBuilder.insert(0,(char)((tmp%10)+'0'));
            in = tmp/10;
        }
        if(in!=0){
            stringBuilder.insert(0,in);
        }
        return stringBuilder.toString();
    }




    public String multiply(String num1, String num2) {
        if(num1.equals("0")||num2.equals("0"))
            return "0";
        int[] result = new int[num1.length()+num2.length()];
        for(int i=0;i<num1.length();++i){
            for(int k=0;k<num2.length();++k){
                int one = num1.charAt(i)-'0';
                int two = num2.charAt(k)-'0';
                int tmp = one*two;
                result[i+k+1]+= tmp%10;
                result[i+k] += tmp/10;
            }
        }
        for(int i=result.length-1;i>0;--i){
            if(result[i]>9){
                int tmp = result[i];
                result[i] %= 10;
                result[i-1]+= tmp/10;
            }
        }
        StringBuilder stringBuilder = new StringBuilder();
        int i=0;
        while (i<result.length-1){
            if(result[i]!=0)
                break;
            ++i;
        }
        for(;i<result.length;++i){
            stringBuilder.append((char)(result[i]+'0'));
        }
        return stringBuilder.toString();
    }