当前位置: 代码迷 >> 综合 >> POJ 1401 Factorial
  详细解决方案

POJ 1401 Factorial

热度:46   发布时间:2023-12-11 20:52:39.0

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 longint 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 longint 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;
}