N!
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 65997 Accepted Submission(s): 18938
Problem Description
Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N!
Input
One N in one line, process to the end of file.
Output
For each N, output N! in one line.
Sample Input
1 2 3
Sample Output
1 2 6/* 用一个long long的大数组储存值,每个数组元素存一段,每段最多为8位数。较好的解决了这个大数问题。 大数阶乘模板 */ #include<stdio.h> #include<string.h> #define N 100000000 //10^8 long long n,i,num[10000],t; //num[]分段记录N!这个数字 void f(long long i) { if(num[i]>=N) //数组里每个数最多记10^8 { if(i+1>=t) t++; num[i+1]+=num[i]/N; //把超过N的放到数组下一个位置去 num[i]=num[i]%N; //当前位置的值变成求余的值 f(i+1); //递归直到跳出if(num[i]>=N)条件 } } int main() { while(~scanf("%lld",&n)) { memset(num,0,sizeof(num)); //清零 num[0]=1; t=1; if(n==0) printf("1\n"); //0的阶乘是1 else { for(;n>0;n--) //max = 10000 { //i和t都是全局变量 for(i=t-1;i>=0;i--) //t从1开始 比num的下标多1 { num[i]*=n; f(i); } } printf("%lld",num[t-1]); //t从1开始 比num的下标多1 if(t>1) for(i=t-2;i>=0;i--) //从后往前输出 printf("%08lld",num[i]); //输出不足8位 在前面补0 printf("\n"); } } }