阶乘后面0的数量

题目:

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

文章参考了此博客:https://www.cnblogs.com/kuliuheng/p/4102917.html

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值