1. 程式人生 > >關於N的階乘(n!)的java演算法實現

關於N的階乘(n!)的java演算法實現

很多公司面試都會有一個問題,就是求N階乘,主要是考查一些程式設計的基礎知識如迴圈、型別的最大長度、遞迴等。

例如最簡單的實現是:

public void factorial(int n){

long result = 1;

for(int i=0;i<n;i++){

result = result*i;

}

}

但是,這個簡單的實現可能會出現問題, n一大就會超過long的最大值,從而導致錯誤。

而且隨著n的增大,數會越來越大,即使是double也無法滿足計算的需要。

為了解決這個問題,唯一的辦法就是使用字串,才能避免型別越界和數字大的問題,下面是基本的演算法思路:

1)將數字用科學計數法表示,例如1234可以表示位1*1000+2*100+3*10+4*1

1000是10的3次方,100是10的2次方,10是10的1次方,1是10的0次方,依次類推。

2)兩個多位數(10以上)相乘拆分成多次乘法,然後進行相加。

3)兩個數相乘可以表示成兩個數進行表示

4)用IntegerString[]陣列表示一個數

程式如下:

定義類:

//表示一個數字,使用科學計數法。如500表示IntegerString(5,2)

public class IntegerString {
private int number = 0;//數字
private int length = 0;//10的length次方
/** Creates a new instance of IntegerString */
public IntegerString(int number,int length) {
this.number = number;
this.length = length;
}
public int getNumber(){
return this.number;
}
public int getLength(){
return this.length;
}
}

/**

兩個數相乘,結果用兩個數來表示,一個是高位,一個是低位

**/

public class MultiplyResult {

private IntegerString high;
private IntegerString low;
/** Creates a new instance of MultiplyResult */
public MultiplyResult(IntegerString a,IntegerString b) {
int result = a.getNumber()*b.getNumber();
int length = a.getLength()+b.getLength();
if(result>=10){
high = new IntegerString(result/10,length+1);
low = new IntegerString(result%10,length);
}else{
high = new IntegerString(result,length);
low = new IntegerString(0,length-1);
}
}
public String toString(){ //列印方便,以便除錯
StringBuffer sb = new StringBuffer();
sb.append(high.getNumber());
sb.append(low.getNumber());
for(int i=0;i<low.getLength();i++)
sb.append("0");
return sb.toString();
}
public IntegerString getHigh(){
return high;
}
public IntegerString getLow(){
return low;
}

}