Leedcode—两个字符串相乘

 两个字符串相乘即大数乘法

以下给出大数乘法的递归解题思路,以及java中用BigInteger类实现的大数乘法。

package com.cll.cn.algorithm;

import java.math.BigInteger;

/**
 * 大整数乘法
 */
public class BigIntegerMul {
    //生成0
    private static String zero(int n){
        if(n==0) return "";
        if(n==1) return "0";
        return zero(n/2)+zero(n/2)+zero(n%2);
    }
    //两个字符串相加
    private static String add(String a,String b){
        if(a.length()<=8 && b.length()<=8){
            return Integer.parseInt(a)+Integer.parseInt(b)+"";
        }
        //将a为两部分
        String a1="0";
        String a2=a;
        if(a.length()>8){
            a1=a.substring(0,a.length()-8);
            a2=a.substring(a.length()-8);
        }
        //将b切分成两部分
        String b1="0";
        String b2=b;
        if(b.length()>8){
            b1=b.substring(0,b.length()-8);
            b2=b.substring(b.length()-8);
        }

        String t=add(a2,b2);
        while(t.length()<8){
                t="0"+t;
        }
        if(t.length()>8){
            return add(add(a1,b1),"1") + t.substring(1);
        }
        return add(a1,b1)+t;
    }

    //两个字符串相乘
    private static String multi(String a,String b){
        if(a.length()<=4 && b.length()<=4){//如果是int类型就直接计算
            return Integer.parseInt(a) * Integer.parseInt(b)+"";
        }
        if(a.length()>4){
            int k=a.length()/2;
            String a1=a.substring(0,k);
            String a2=a.substring(k);
            return add(multi(a1,b)+zero(a2.length()), multi(a2,b));
        }
        return multi(b,a);//当b的长度很长时放在参数a的位置上就好了
    }
    public static void main(String[] args) {
        System.out.println(multi("1234567890987654321666","1234567890987654321555"));
        BigInteger a=new BigInteger("1234567890987654321666");
        BigInteger b=new BigInteger("1234567890987654321555");
        System.out.println(a.multiply(b));
    }
}

 

你可能感兴趣的:(编程题)