可以用大数类存放末几位的数字。乘出来有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;
}
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就可以了。
佩服哦!*/
此算法已被证伪