关于大数相乘问题(Java实现)

来源:互联网 发布:nginx 点播服务器 编辑:程序博客网 时间:2024/05/16 11:22

//假设有两个数,这两个数非常大而且无法用Java的整数类型表示,远远超出计算机的表达范围,用计算这两个数相乘的结果。我们首先应该想用字符串来表达这两个数,假设这两个字符串为n与m,那么这两个数相乘结果的位数为n+m或者是n+m-1,通过借助辅助空间O(n+m)来保存进位来帮助实现。
算法评价:
时间复杂度:O(n*m),空间复杂度O(n+m)(由于涉及到进位可能最坏时间复杂度远远超过了O(n*m))

public class BigNumMSultiply {    public static void main(String[] args) {        // TODO Auto-generated method stub        String n="1231111111111111111111111";        String m="222331111111453532222222222";        char[] chs=new char[n.length()+m.length()];        for(int i=0;i<chs.length;i++){            chs[i]='0';        }        int n1=0;        int m1=0;        int res=0;        int startIndex=0;        int num=0;        String reString="";        for(int i=n.length()-1;i>=0;i--){            n1=n.charAt(i)-'0';            startIndex=n.length()-1-i;            for(int j=m.length()-1;j>=0;j--){                m1=m.charAt(j)-'0';                res=n1*m1;                loopAdd(chs,res,startIndex);                ++startIndex;            }        }        for(int i=chs.length-1;i>=0;i--){            if(chs[i]=='0'&&i==chs.length-1){                continue;            }            reString=reString+chs[i];        }        System.out.println(reString);    }    private static void loopAdd(char[] chs,int num,int startIndex){        int mod=0;        int index=0;        mod=num%10;        index=num/10;        int data=chs[startIndex]-'0'+mod;        while(true){            if(data<10){                chs[startIndex]=(char) (data+'0');                break;            }else{                chs[startIndex]=(char) (data%10+'0');                data=data/10+index+chs[startIndex+1]-'0';                mod=data%10;                index=data/10;                startIndex++;            }        }    }}