题解 | #阶乘末尾0的数量#

阶乘末尾0的数量

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

题意概述

  • 给定一个非负整数n
  • 返回n!结果的末尾为0的数量

方法一:数学

思路与具体做法

  • 因为0来源于2*5所以一对2和5即可产生一个0,所以0的个数即为阶乘中5的个数和2的个数的最小值
  • 又因为2的倍数的数一定比5的倍数的数多,所以只需要统计5的个数了 alt
class Solution {
public:
    long long thenumberof0(long long n) {
        long long ans=0;
		while(n){
			ans+=n/5;
			n/=5;
		} 
		return ans;
    }
};

时间复杂度和空间复杂度分析

  • 时间复杂度:O(5n)O(\log_{5}{n} ),n不断除以5
  • 空间复杂度:O(1)O(1),用到常数个额外空间。

方法二:勒让德定理

思路与具体做法

  • 定理 alt

  • 推广:求n!n!中因子pp的个数

  • 因为n!=12..nn!=1*2*..*n,所以含有一个pp的有 np\frac{n}{p}个,含有两个pp的有 np2\frac{n}{p^2}个...把以上全部加起来即为答案了

  • n!n!末尾0的个数,即用勒让德定理求n!n!中因子10的个数。因子10可拆分2*5。随着a的增加,显然含有2的因子比含有5的因子要多,因此只需要统计包含5因子的个数即可,即p=5,每有一个5,阶乘末尾就会多出来一个0,这样a/5就能统计出第一层5的个数,并依次处理,就能统计出所有5的个数,也就能统计出阶乘末尾0的个数。

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

时间复杂度和空间复杂度分析

  • 时间复杂度:O(5n)O(\log_{5}{n} ),n不断除以5
  • 空间复杂度:O(1)O(1),用到常数个额外空间。
全部评论

相关推荐

不愿透露姓名的神秘牛友
06-27 15:19
简历上能写3个月吗?
码农索隆:大胆写,主要你能把实习经历包装好,可以看一下我这篇帖子https://www.nowcoder.com/share/jump/4888395581180798063
点赞 评论 收藏
分享
05-05 21:45
已编辑
广州大学 Java
点赞 评论 收藏
分享
06-08 22:25
门头沟学院 Java
从零开始的转码生活:这hr不会打开手机不分青红皂白给所有人群发这句话,过一会再给所有人再发一遍,这肯定会有重复的,不管,再过一会再发一遍
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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