【牛客题霸题解】阶乘末尾0的数量

阶乘末尾0的数量

http://www.nowcoder.com/practice/aa03dff18376454c9d2e359163bf44b8

观察一下10以内的数字互相乘,会发现,只有





相乘会产生0,而且 ...
所以我们只需要看一下 以内 能拆出多少对
然后我们可以发现,有5因子的数比有2因子的数要少,所以我们就看能拆出来多少5就可以了,因为肯定能有足够数量的因子2来匹配。

所以阶乘末尾0的数量就是 中能拆出来的5的数量。但是,从 1 遍历到 n 每个数看一下它能除多少次 5 是不行的。因为 n 的数据范围是1e18。遍历1e18个数复杂度太大了。
那我们来考虑一下,5的倍数可以至少产生1个5,25的倍数可以产生至少2个5,125的倍数可以产生至少3个5...
这样的话 中有n/5个5的倍数,n/25个25的倍数,n/125个125的倍数...
所以答案就是 n/5+n/25+n/25...

c++

class Solution {
public:
    long long thenumberof0(long long n) {
        long long ans = 0;
        long long d = 5;
        while(n>=d)
        {
            ans+=n/d;
            d = d*5;
        }
        return ans;

    }
};

java

import java.util.*;
public class Solution {
    public long thenumberof0 (long n) {
        long ans = 0;
        long d = 5;
        while(n>=d)
        {
            ans+=n/d;
            d = d*5;
        }
        return ans;
    }
}

python

class Solution:
    def thenumberof0(self , n ):
        ans = 0
        d = 5
        while n>=d:
            ans+=n//d
            d = d*5
        return ans
牛客题霸题解 文章被收录于专栏

QAQ

全部评论
1~n 中有 n/5 个 5 的倍数, 有 n/25 个 25 的倍数, ... , 之所以最后结果是 n/5 + n/25 + n/125 + ... , 而非 n/5 + 2*n/25 + 3*n/125 + ... , 是因为 n/25 的 2 个 5 有 1 个在 n/5 的时候已经计算过了一遍. 如果倒过来计算的话, 假设除以 k 次幂时按照其贡献了 k 个 5, 在计算 k-1 次幂时, 应当用 k-1 乘以是 5^(k-1) 的倍数且不是 5^k 的倍数的数字的个数, 在计算 k-2 次幂时, 应当用 k-2 乘以是 5^(k-2) 的倍数且不是 5^(k-1) 以及 5^k 的倍数的数字的个数(只需要减去 5^(k-1) 的倍数的数字的个数即可, 因为其包含了 5^k 的倍数的数字). k*n/5^k + (k-1)*(n/5^(k-1) - n/5^k) + (k-2)*(n/5^(k-2) - n/5^(k-1)) + ... + 1*(n/5 - n/5^2). 以 n 为 125 为例, 3*125/5^3 + 2*(125/5^2 - 125/5^3) + 1*(125/5^1 - 125/5^2) = 125/5^3 + 125/5^2 + 125/5 = 31
3 回复 分享
发布于 2021-09-03 15:28
也可以换个角度思考.对于n!,单独拿出能产生因子5的数,则可以表示成5*(n/d)!.实际每次遍历就是计算规模为n/d^k的子问题,k是递归次数
点赞 回复 分享
发布于 2022-11-09 10:57 广东

相关推荐

秋招结束已经一段时间了 一直在忙着毕业的事情 浅浅总结一下自己的秋招经历吧~本人BG双非硕 后端选手 有一段小厂+腾讯暑期实习腾讯暑期转正loser秋招结束已经结束了有一段时间了总结一下秋招历程最大的感受就是秋招比起暑期更加卡学历秋招总共投了60多家吧一直面 一直挂也投了两家银行科技岗 都走到终面体检了都拒了(总体感觉本地的银行还是挺容易过的)可能本人更想去私企 并且银行也挺卷听说一直到11月就只有一家小厂的offer并签约当保底然后也突然被WXG捞了 本来都不对腾讯抱有希望了可能经过一整个秋招的面试积累吧 以及本人有ACM经历 WXG整体面试以做题偏多(一二面做了5道题 4道hard) 比较合自己胃口 差不多半个月就把五轮面试过了进入录用评估 但也一直没有结果到后面也陆陆续续有几家中厂也终面过泡池子一直到12月初华子给开了base杭州 14a因为华子公积金的原因 和小厂薪资上差距不大 所以也一直犹豫是否毁约签华子 但是内心也还对WXG抱有一丝幻想(虽然一直没有保温也没有任何消息)然后一直到12月中下旬 华子要求去现场签约了 但是WXG还是没有消息 然后就连续发邮件和打电话催了好多次 还是回复耐心等待直到华子签约那天 经过内心挣扎已经决定毁约签华子了 可能还是想平台更大一点吧 然后最戏剧性的一幕来了 就在我发毁约邮件没有5秒 WXG打电话开奖了 并且开奖也十分有诚意 最终还是没有签约成功华子 研究生期间也打了很多次华子的比赛还是对华子有感情的555整个秋招都是伴随着焦虑的 我认为自己也是秋招大部分人的画像 屡屡碰壁后不断怀疑自己 但是可能自己也比较幸运吧 但是也感谢自己在一次次陷入迷茫都没有放弃自己 还是一直努力背八股 刷题也祝各位牛友们共勉 就算暂时没有好的offer 不放弃一定会有好的结果的!!
点赞 评论 收藏
分享
评论
28
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务