let43 Multiply String

主题思想: 大数乘法, 这里写一种大数乘法的通用模板,整体思路是: 利用数组,一个int型数组表示长度为4的子串, 为什么是4呢? 因为int 型 21亿,1亿=10^9, 长度为4最大值9999,两个值相乘<10^8 ,结果仍可以用一个int表示。
大体思路如下,把字符串,按每四位截取,并转换成int 存储在数组里

运算时,对int数组进行运算,输出结果需要注意,去除前导0, 对于中间值为0的情况,要输出4个0.

代码:

class Solution {
    public String multiply(String num1, String num2) {
        if(num1==null||num1.length()==0) return "";
        if(num2==null||num2.length()==0) return "";
        int n=30;
        int[] arr1=new int[n];
        int[] arr2=new int [n];
        int [] sum=new int[2*n];
        for(int i=0;i<n;i++){
            arr1[i]=0;
            arr2[i]=0;
        }
        for(int i=0;i<2*n;i++)sum[i]=0;
       str2array(num1,arr1);
       str2array(num2,arr2);

        int carry=0;
        int tmp=0;
         for(int i=0;i<n;i++){
            carry=0;
            tmp=0;
            for(int j=0;j<n;j++){
                tmp=arr1[i]*arr2[j]+carry;
                sum[i+j]+=tmp;
                carry=sum[i+j]/10000;
                sum[i+j]=sum[i+j]%10000;
            }
        }
      String ans="";
       int start=2*n-1;
        for(int i=2*n-1;i>=0;i--){
            if(sum[i]!=0) {
                start=i;
                break;
            }
        }
        if(start==2*n-1) return "0";

        for(int j=start;j>=0;j--) {
            ans=ans+int2str(sum[j]);
        }
        start=0;
        for(int i=0;i<ans.length();i++){

            if(ans.charAt(i)!='0'){
                start=i;
                break;
            }
        }
        return ans.substring(start);

    }

    public void str2array(String num,int[] array){
        int len=(num.length()+3)/4;
         int tmp=0;
        for(int i=0;i<len;i++){
            tmp=num.length()-i*4;
            array[i]=str2int(num.substring(Math.max(tmp-4,0),tmp));
        }
        return ;
    }
    public int str2int(String str){
        int sum=0;
        for(int i=0;i<str.length();i++){
            sum=sum*10+(int)(str.charAt(i)-'0');
        }
        return sum;
    }
    public String int2str(int num){
        String s="";

        while(num!=0){
            s=(num%10)+s;
            num/=10;
        }
        int rawLen=s.length();

        for(int i=0;i<4-rawLen;i++){
            s="0"+s;
        }

        return s;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值