//假设有两个数,这两个数非常大而且无法用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++;
}
}
}
}