问题描述
输入一个正整数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 }