n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推。
将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意处理相应的进位。
首先将a设为1,然后乘2,乘3,当乘到n时,即得到了n!的值。import java.util.Scanner;
public class Factorial {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
int[] res = new int[3000];
//最大值先存入数组,开始递减方向累乘,每次累乘得到结果存入数组。
res = getRes(res, num, 0);
int len = 0; //最终数组的长度
if(num == 1){
System.out.print(num);
return ;
}
for(int j = num; j > 1; j--){
int bw = 0; //当前数位大小
int jw = 0; //进位大小
for(int i = 0; ; i++){
bw = res[i];
res[i] = ((bw * (j - 1)) + jw) % 10;
jw = ((bw * (j - 1)) + jw) / 10;
if(res[i+1] == 1009){
res = getRes(res, jw, i+1);
len = i + 1;
break;
}
}
}
for(int i = len - 1; i >= 0; i--){
System.out.print(res[i]);
}
}
/**
* 获得满足需求的数组
* @param arr 数组
* @param num 处理大于10的数据,分成若干个小于10的数据存入数组
* @param n 从角标为n开始重新在数组中存入这个大于10的数据
* @return array
*/
private static int[] getRes(int[] arr, int num, int n) {
if(num == 0){
return arr;
}
for(int i = n; ; i++){
arr[i] = num%10;
num /= 10;
if(num == 0){
arr[i+1] = 1009;
break;
}
}
return arr;
}
}