您的位置:首页 > 其它

1042 N!

2015-07-25 01:36 246 查看

N!

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)

Total Submission(s): 65272    Accepted Submission(s): 18669


[align=left]Problem Description[/align]
Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N!

 

[align=left]Input[/align]
One N in one line, process to the end of file.

 

[align=left]Output[/align]
For each N, output N! in one line.

 

[align=left]Sample Input[/align]

1
2
3

 

[align=left]Sample Output[/align]

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: