編程求n

問題分析:問題要求對輸入的正整數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補上。

這種方法還是很有侷限,希望大家指正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章