阶乘末尾非零数求和
Time Limit:1s Memory Limit:1000k
Total Submit:4730 Accepted:1336
下载样例程序(PE)
下载样例程序(ELF)
--------------------------------------------------------------------------------
Problem
对于小于25000的自然数n,求阶乘n!,(n-1)!,(n-2)!...3!,2!,1!右边的非零数之和。
例如:
当n=5时,
5!=120,右边非零数为2;
4!=24,右边非零数为4;
3!=6,右边非零数为6;
2!=2,右边非零数为2;
1!=1,右边非零数为1。
其右边的非零数之和为15。
Input
本题有多组数据,每组数据包含一个正整数N(N不大于25000)占一行。
Output
对给定的每组输入数据,输出一个整数。每个结果占一行。不要输出额外的空行。
Sample Input
5
10
1
Sample Output
15
39
1
#include<iostream.h>
int deal(int n,int &bn)
/*n为待处理的数,处理的结果是先去除尾部所有0,然后去掉2或5的因子
*bn返回因子2的个数减因子5的个数
*函数返回去掉这些因子的n
*/
{
while(n%10==0)n/=10;
if(!(n&1))
do{n>>=1;++bn;}
while(!(n&1));
else
while(n%5==0){n/=5;--bn;}
return n;
}
int main()
{
static int d[4]={6,2,4,8};//d[n]:=2^n%10,2的n次方的个位数,n>0
int n,bn,j,t;
long s;
while(cin>>n)
{
for(bn=0,t=1,s=1,j=2;j<=n;++j)
{
t=t*deal(j,bn)%10;
s+=t*d[bn%4]%10;
}
cout<<s<<endl;
}
return 0;
}
正文
[TOJ]1011阶乘末尾非零数求和2005-06-05 15:27:00
【评论】 【打印】 【字体:大 中 小】 本文链接:http://blog.pfan.cn/rickone/1490.html
阅读(8002) | 评论(0)
版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!
评论