http://poj.org/problem?id=1401
题意:
求n的阶乘末尾有几个0
思路:
思路很简单,只要找因子里5的个数,因为2肯定比5多(别问我为什么),一开始我是依次找每个乘数里5的个数,结果显而易见,TL,我自己都为我的智商惊叹了。。。实际上,(以下网上抄的)1~N中只有5的倍数包含5因子,比如[5, 10, 15, 20...],所以我们抽出其中每个数的一个5因子,这时候就只剩下[1, 2, 3, ...., N/5]了,其他没有5因子的就都给扔掉就行了。
你会发现新产生的这个序列又是一个相同的问题。
写出递推式就是:F(n) = n/5 + f(n/5),可以用递归也可以用循环实现。
擦。。。所以说。。。智商是硬伤。。。
代码:
TL的代码:
#include <cstdio>
#define LL long long
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
int n;
scanf("%d", &n);
LL sum = 0;
for(int i = 1; i <= n; i++)
{
int x = i;
while(x % 5==0)
{
sum = sum++;
x = x / 5;
}
}
printf("%I64d\n", sum);
}
return 0;
}
A了的代码:
#include <cstdio>
#define LL long long
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
int n;
scanf("%d", &n);
LL sum = 0;
while(n)
{
sum = sum + n / 5;
n = n / 5;
}
printf("%I64d\n", sum);
}
return 0;
}