描述
我们都知道如何计算一个数的阶乘,可是,如果这个数很大呢,我们该如何去计算它并输出它?
-
输入
- 输入一个整数m(0<m<=5000) 输出
- 输出m的阶乘,并在输出结束之后输入一个换行符 样例输入
-
50
样例输出
30414093201713378043612608166064768844377641568960512000000000000
解题思路:
java中的int为4个字节,没办法存下那么大的数字,所以只能转用其他办法解决,这里使用的是数组
1,创建一个足够大的数组,int a[20000][2]其中的第一位用来存数值,第二位用来标记当前这一位是否可用,这个值为1时表示当前这一位可用,0不可用。
2,设置数组的a[0][1],a[0][0]都为1,表示当前的第一位可用。
3,开始计算阶层,思路是这样的,用数组中所有能用的单元,都乘上这个数,然后,如果当前的数组中的这个值大于了9,表示要进位,将当前这个值除以10的数加到下一位,然后再自己对10求余,这样算到能用的最高位,如果最高位还是要进位,就把最高位+1的位置设置为可用,然后存在来,就这样,直到所有数字都算完,然后从最高位开始输出当前数组中的值,即是我们要的结果
代码:
import java.util.Scanner; public class 大数阶乘 { public static int a[][]=new int[20000][2]; public static void main(String []arg) { Scanner scanner =new Scanner(System.in); int i=scanner.nextInt(); get_result(i); } public static void get_result(int number) { int i=0,j=0; a[0][0]=1; a[0][1]=1; for(i=number;i>0;i--) { for(j=0;a[j][0]==1;j++) { a[j][1]=a[j][1]*i; } for(j=0;a[j][0]==1;j++) { if(a[j][1]>9) { a[j+1][0]=1; a[j+1][1]=a[j+1][1]+a[j][1]/10; a[j][1]=a[j][1]%10; } } } for(j=0;a[j][0]==1;j++); j--; for(;j>=0;j--) System.out.print(a[j][1]); System.out.println(); } }