Fancy Mouse
- -|||

可以用大数类存放末几位的数字。乘出来有0就舍去。这是我的代码:(用long long即64位整形变量来计算)

#include<iostream>
using namespace std;

int main()
{
    unsigned 
long long n,t,sum,temp;
    
while(cin>>n)
    
{
        
for(t=temp=1,sum=0;t<=n;t++)
        
{
            temp 
*= t;
            
while(temp%10 == 0) temp /= 10;
            sum 
+= temp%10;
            temp 
%= 1000000;
        }

        cout
<<sum<<endl;
    }

    
return 0;
}

/*而Maigo大牛给了另一种不需要大数类的算法:
首先,由于n!有2因子(特殊情况8算,下同),因此必定为偶数,而且n的5因子一定少于2因子,因此末尾的那个数必定为偶数(n=1除外哦)
随后考虑知道(n-1)!的末尾数求n!的末尾数(当5|n时)
2*5 = 10(舍去) or 60
4*5 = 20 or 70(X)
6*5 = 30(X) or 80
8*5 = 40 or 90(X)
于是(2,4,6,8)经过一次变换变成(6,2,8,4)
注意到(2,4,6,8) * 8 = (16,32,48,64),末尾正好是(6,2,8,4)
因此我们把乘一个5位末尾的数当作乘以8就可以了。

佩服哦!*/
此算法已被证伪
posted on 2005-08-21 20:49  Fancy Mouse  阅读(613)  评论(7编辑  收藏  举报