Java计算阶乘(n!)需要使用实现使用BigDecimal类,因为用int最多正确算到12!,用long最多正确算到20!
计算机中提供了长整型和双精度等能存储较大数的数据类型,但在有些时候,这样的数据类型不能满足实际应用的需求,比如大数的阶乘。请编写程序,实现大数阶乘的算法。要求能计算N(6<=N<=300)的阶乘。
import java.util.Scanner;
/**
* 大数的阶乘
* @author JiaJoa
*
*/
public class JieCheng {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int num = in.nextInt();
int[] arr = new int[num*5]; //申请一个较大数组保存每次相乘的结果
arr[arr.length-1] = 1; //注意从数组的末尾开始向前端插入数字,并且由于0!=1,1!=1,直接从1开始计算
for(int n=2;n<=num;n++){
arr = multiply(arr,n);
}
display(arr); //打印阶乘的结果
in.close();
}
//计算两个数字的乘积,其中一个数字较大,使用数组保存,另一个为整形
public static int[] multiply(int[] arr,int n){
for(int i=0;i<arr.length;i++){ //模仿数字乘法的过程,先用数组的各位乘以该整形n
arr[i]*=n;
}
for(int i=arr.length-1;i>0;i--){ //对数组中相乘后的各位进行十进制转换,大于10的进位处理
arr[i-1] += arr[i]/10; //使用相乘计算进位
arr[i] = arr[i]%10; //使用相与计算该位数字
}
return arr;
}
//打印阶乘的结果
public static void display(int[] arr){
StringBuilder sb = new StringBuilder("");
int flag = 0;
for(int i=flag;i<arr.length;i++){
sb.append(arr[i]);
}
String str = sb.toString().replaceAll("^0*", "").trim(); //剔除结果中前端的0
System.out.println(str);
}
}