關於大數相乘問題(Java實現)
阿新 • • 發佈:2019-02-04
//假設有兩個數,這兩個數非常大而且無法用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++;
}
}
}
}