大数的阶乘问题

直接使用现有的基本数据类型(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 }

 

posted @ 2017-11-06 14:48  JiaJoa  阅读(828)  评论(0编辑  收藏  举报