大数的阶乘问题
直接使用现有的基本数据类型(int,long)等保存大数的阶乘结果显然是不行的,因为不论是int,还是long类型,都只能保存一定的数字范围的数,而阶乘的结果可能非常巨大,基本数据类型显然是无法胜任的。那如何计算较大数字的阶乘呢?可以使用数组来保存阶乘的结果,申请一个较大长度的数组便可实现保存较大数字的阶乘。具体实现代码如下(Java版):
1 import java.util.Scanner; 2 /** 3 * 大数的阶乘 4 * @author JiaJoa 5 * 6 */ 7 public class JieCheng { 8 9 public static void main(String[] args) { 10 11 Scanner in = new Scanner(System.in); 12 int num = in.nextInt(); 13 int[] arr = new int[num*5]; //申请一个较大数组保存每次相乘的结果 14 arr[arr.length-1] = 1; //注意从数组的末尾开始向前端插入数字,并且由于0!=1,1!=1,直接从1开始计算 15 for(int n=2;n<=num;n++){ 16 arr = multiply(arr,n); 17 } 18 19 display(arr); //打印阶乘的结果 20 21 in.close(); 22 } 23 24 //计算两个数字的乘积,其中一个数字较大,使用数组保存,另一个为整形 25 public static int[] multiply(int[] arr,int n){ 26 for(int i=0;i<arr.length;i++){ //模仿数字乘法的过程,先用数组的各位乘以该整形n 27 arr[i]*=n; 28 } 29 for(int i=arr.length-1;i>0;i--){ //对数组中相乘后的各位进行十进制转换,大于10的进位处理 30 arr[i-1] += arr[i]/10; //使用相乘计算进位 31 arr[i] = arr[i]%10; //使用相与计算该位数字 32 } 33 return arr; 34 } 35 36 //打印阶乘的结果 37 public static void display(int[] arr){ 38 StringBuilder sb = new StringBuilder(""); 39 int flag = 0; 40 for(int i=flag;i<arr.length;i++){ 41 sb.append(arr[i]); 42 } 43 String str = sb.toString().replaceAll("^0*", "").trim(); //剔除结果中前端的0 44 System.out.println(str); 45 } 46 }