1.
问题描述
输入一个正整数n,输出n!的值。
其中n!=1*2*3*…*n。
算法描述
n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推。
将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意处理相应的进位。
首先将a设为1,然后乘2,乘3,当乘到n时,即得到了n!的值。
输入格式
输入包含一个正整数n,n<=1000。
输出格式
输出n!的准确值。
样例输入
10
样例输出
3628800
这个题目的思路其实在题目中已经告诉你了,用数组来存放目标数的每个“位”从下标0开始0存放的是这个数的各位然后下标1是十位一次类推,然后开始阶乘了满10就向前进一个位,数组中的每一个数都要和“i”也就是那个阶乘的数相乘从个位开始乘然后得到的结果就是sum然后sum对10取余得到的就是当前这个位的数字如阶乘数是4时sum=12了取余得到2就是结果的个位然后sum再除10得到的就是要向前进的位数下面是这个程序的代码。
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int num=scan.nextInt();
int[] arr = new int[5000]; // 这里我们用一个很大的数组保险事实上最后的数也差不多大
if(num==1 || num==0) {
System.out.println(1);
}else {
numChange(arr,num);
}
scan.close();
}
public static void numChange(int[] arr, int num) {
int p=0, sum=0, temp=0;
arr[0]=1;
for(int i=1;i<=num;i++) {
for(int j=0;j<=5000;j++) { // 这里就是整个代码的核心了这里的j实际上就是数组的下标
sum=arr[j]*i+temp;
arr[j]=sum%10;
temp=sum/10;
}
}
for(int j=5000;j>=0;j--) {
if(arr[j]!=0) { // 从数组的后往前找非0的数也就是目标数中最高位的那个数的下标
p=j;
break;
}
}
while(p>=0) {
System.out.print(arr[p--]); // 输出
}
}
网友评论