N!
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 65272 Accepted Submission(s): 18669
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
大数阶乘,关键是考虑进位问题,什么时候进位,有时候也是要考虑的,具体看代码注释....
我这里用的是一万进位,因为一万的平方才一亿,不超过Int 范围,但是十万乘以十万就超过了.....
这样的进位比普通求阶乘用的十进制快了很多倍,省去了十进制的没用的进位过程.....
#include<stdio.h>
#include<string.h>
int main()
{
int n;int i,j,k,x[10005],s;
while(~scanf("%d",&n))
{
memset(x,0,sizeof(x));
x[0]=k=1;s=0;//初始化
for(i=2;i<=n;++i)// i 控制的是当前乘多少
{
for(j=0;j<k;++j)// j 控制的是模拟该数的第几位
{
x[j]=x[j]*i+s;//乘法进位
s=0;//每次进位之后都清零
if(x[j]>=10000)//考虑进位的情况...
{
s=x[j]/10000; //需要进位的先存下来,下次再加,想想为什么
x[j]%=10000;
}
}
if(s!=0)//这个是为了判断最高位数,只要最高位进位了,就增加 1 ;
{
++k;
x[j]=s;
s=0;
}
}
printf("%d",x[--k]);//第一位正常输出
for(i=k-1;i>=0;i--)//有了数据记录最高位,输出也就比较方便了.....
{
printf("%04d",x[i]);//注意1万进位的输出格式
}
printf("\n");
}
return 0;
}