正文

[TOJ]1011阶乘末尾非零数求和2005-06-05 15:27:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/rickone/1490.html

分享到:

阶乘末尾非零数求和 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; }

阅读(46991) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册