問題分析:問題要求對輸入的正整數n,計算n!的準確值,而n!的增長速度高於指數增長的速度,所以這是一個高精度計算問題。
請看下面兩個例子:9!=362 880
100!= 93 326 215 443 944 152 681 699 238 856 266 700 490 715 968 264 381 621 468 592 963 895 217 599 993 229 915 608 941 463 976 156 518 286 253 697 920 827 223 758 251 185 210 916 864 000 000 000 000 000 000 000 000
對於這樣的數,我們必須採用數組來存儲。
如果採用我們平常的遞歸方法,當n值過大時候,結果會溢出。代碼如下:
package com.intg;
/*
* 這種方法容易溢出
*/
public class Hierarchy {
public static int f(int n){
if(n == 1){
return 1;
}
else{
return n*f(n-1);
}
}
public static void main(String[] args) {
System.out.println(f(12));
}
}
這種方法只適合當n小於13的值才適合,這是我測試的一個上限值。
當n>=13時,不適合用上述方法,這個時候就需要在中間計算過程中,將中間結果用數組保存起來,改進的遞歸運算:
package com.intg;
public class Hierarchy_1 {
public static int[] f(int n){
int A[] = new int[160];
if(n == 1){
A[0] = 1;
}
else{
int d = 0,b;
int B[] = f(n-1);
int len = B.length;
// System.out.println("len;"+len);
for(int i = 0,j = 0; i <= len-1; i ++,j++){
// System.out.println(j+":"+B[i]);
b = B[i] *n +d;
A[j] = b%10;
d = b/10;
}
while(d != 0){
A[len] =d%10;
d = d / 10;
len++;
}
return A;
}
return A;
}
public static void main(String[] args) {
int B[]= f(100);
System.out.println("B:"+B.length);
for(int i = B.length-1 ; i >= 0 ; i--){
// if(B[i] != 0){
System.out.print(B[i]);
// }
}
}
}
這種方法侷限是不知道如何來確定中間過程中的數組個數,在這裏我就採用100!的最大個數來定的,任意正整數的結果都是160位,所以當維數很小時,都是用0補上。
這種方法還是很有侷限,希望大家指正。