問題描述
輸入一個正整數
n,輸出
n!的值。
其中 n!=1*2*3*…* n。
其中 n!=1*2*3*…* n。
算法描述
n!可能很大,而計算機能表示的整數范圍有限,需要使用高精度計算的方法。使用一個數組
A來表示一個大整數
a,
A[0]表示
a的個位,
A[1]表示
a的十位,依次類推。
將 a乘以一個整數 k變為將數組 A的每一個元素都乘以 k,請注意處理相應的進位。
首先將 a設為1,然后乘2,乘3,當乘到 n時,即得到了 n!的值。
將 a乘以一個整數 k變為將數組 A的每一個元素都乘以 k,請注意處理相應的進位。
首先將 a設為1,然后乘2,乘3,當乘到 n時,即得到了 n!的值。
輸入格式
輸入包含一個正整數
n,
n<=1000。
輸出格式
輸出
n!的准確值。
樣例輸入
10
樣例輸出
3628800
思路:有兩種方法可以解決:
法一:(真的很是暴力)使用大數存儲類BigInteger,只要你電腦內存夠你就可以輸出夠大的數
1 import java.math.BigInteger; 2 import java.util.Scanner; 3 4 public class Main{ 5 6 public static void main(String[] args) { 7 Scanner in=new Scanner(System.in); 8 Factor F=new Factor(); 9 int N; 10 N=in.nextInt(); 11 BigInteger fac; 12 fac=F.factor(N); 13 System.out.println(fac); 14 } 15 } 16 17 class Factor{ 18 BigInteger factor(int N) { 19 if(N==1||N==0) { 20 return BigInteger.valueOf(1); 21 }else { 22 return BigInteger.valueOf(N).multiply(factor(N-1)); 23 } 24 } 25 }
法二:較之前的法一比較,較為技巧一點。我們使用數組來進行大數的存儲。代碼不長在這里不再進行多余的解釋。
1 import java.util.Scanner; 2 3 public class Main{ 4 5 public static void main(String[] args) { 6 Scanner in = new Scanner(System.in); 7 int[] array = new int[100000]; 8 int N; 9 array[0] = 1; 10 N = in.nextInt(); 11 for (int i = 1; i <= N; i++) { 12 int r = 0; 13 for (int j = 0; j < array.length; j++) { 14 int temp = array[j] * i + r; 15 array[j] = temp % 10; 16 r = temp / 10; 17 } 18 } 19 20 boolean begin = false; 21 22 for (int i = array.length - 1; i >= 0; i--) { 23 if (begin) { 24 System.out.print(array[i]); 25 continue; 26 } 27 if (array[i - 1] != 0) { 28 begin = true; 29 } 30 } 31 } 32 }