HDU_1042N!(关于阶乘)

来源:互联网 发布:手机淘宝怎么上咸鱼 编辑:程序博客网 时间:2024/05/19 22:58

                                            N!

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
123
 

Sample Output
126
代码:

#include<iostream>using namespace std;int a[8001],n;int main(){    while(scanf("%d",&n)!=EOF)    {        int i,j;        memset(a,0,sizeof(a));a[0]=1;        for(i=2;i<=n;i++)        {            for(j=0;j<8000;j++) a[j]*=i;                for(j=0;j<8000;j++)            {                a[j+1]+=a[j]/100000;                a[j]%=100000;            }        }            for(i=8000;i>=0&&!a[i];i--);        printf("%d",a[i--]);        for(;i>=0;i--) printf("%05d",a[i]);        printf("\n");    }    return 0;}
这是杭电中的题。我用以往的思路敲的代码,无法通过。经过很多次数据测试才明白是结尾“0”的原因,没处理好。
所以有了对“0”的输出。%d是空输出格式,后面接05,表示输出的数有五位,不够用0补!注意如果去掉0,就变成用空格补!如果是.5,就表示小数点后保留5位!

还有一些有趣的关于阶乘的问题,分享一下。。。

1 100的阶乘,末尾有几个连续的零?(如:2100的最后有2个零)

2 1到100的阶乘的和的末位数是几?

3 10000的阶乘,末尾有多少个连续的零?

解答和分析:

 

1 100的阶乘,末尾有几个连续的零?

答案是24。

思路有两个:

先讲笨方法,采用分类讨论的方法。你可以知道100的阶乘里有无数的2,比如8=2*2*2等等。而10是由2*5组成的,其他的数字无论怎么乘都都无法形成10。所以我们只要关注2和5即可。由于100的阶乘中2很多,它们都嗷嗷待哺的希望和5结合成10。你还应该注意到一个情况,25、50、75这三个比较特殊,25乘以若干个2会得到100,而50*2会得到100,而75乘以若干个2后会得到1500,所以这三个数会分别产生2个0。好了,现在可以开始数了,10、20..100有11个0,5、15..95有10个0,而25、50和75又会多产生1个0,所以11+10+3=24。

再讲巧方法:100/5+100/(5*5)=24。这是因为包括5这个因子的数有100/5=20个,而包含25因子的有100/25=4个,所以结果为24个。

2 1到100的阶乘的和的末位数是几?

答案:3

这题找规律,1!=1; 2!=2; 3!=6; 4!=24; 5!=120;…你可以发现5的阶乘之后的末尾都是0。所以只有1到4的阶乘会产生个位数,所以1+2+6+24=33,所以答案就是3!

3 10000的阶乘,末尾有多少个连续的零?

答案: 10000/5+10000/25+10000/125+10000/625+10000/3125=2000+400+80+16+3=2499

知道什么规律吗?除数 5,5*5,5*5*5,5*5*5*5,5*5*5*5*5.因为10000是五位数。

再想一下,1000的阶乘,末尾有多少个连续的零?

答案:1000/5+1000/25+1000/125+1000/625=200+40+8+1=249.

625=5*5*5*5,是4个5相乘,1000是四位数。。。明白???

0 0
原创粉丝点击