题目:
1003 阶乘后面0的数量
n的阶乘后面有多少个0?
6的阶乘 = 1*2*3*4*5*6 = 720,720后面有1个0。
收起
输入
一个数N(1 <= N <= 10^9)
输出
输出0的数量
输入样例
5
输出样例
1
有思路了,这个题并不难。写它是因为网上很多题解,没有把思想真正表达清楚,所以想写一份题解,谈谈我的看法。
题解:
此类问题很显然属于数学问题,一定要找到其中的本质规律才能得到正确的数学模型。
两个大数字相乘,都可以拆分成多个质数相乘,而质数相乘结果尾数为0的,只可能是2*5。如果想到了这一点,那么就可以进一步想到:两个数相乘尾数0的个数其实就是依赖于2和5因子的个数。又因为每两个连续数字就会有一个因子2,个数非常充足,所以此时只需要关心5因子的个数就行了。
那么如何找到n!中5因子的个数呢?
来看栗子:
10!=10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 可以看到10!中5的因子为10和5,有两个
15!=15 * 14 * 13 * 12 * 11 * 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 15!中5的因子是15、10和5,有三个
由此可见,n除以5便可得到5的因子sum。
但是,当5的因子不止含有一个5呢?例如25、125、625。
当5的因子含有2个5相乘时,25 = 5 * 5,我们需要将sum加上n除以5再除以5的个数,这时sum就包含将25分成两个5的因子之后的总个数。
当5的因子含有3个5相乘时,125 = 5 * 5 * 5,我们需要将sum加上n除以5再除以5再除以5的个数,这时sum就包含将125分成3个5的因子之后的总个数。
......(这个过程可以凭借while循环实现)。
AC代码实现:
#include <iostream>
using namespace std;
int main()
{
int N;
cin >> N;
int sum = 0;
while(N)
{
sum += N/5;
N /= 5;
}
cout << sum << endl;
return 0;
}