LeetCode 172 Factorial Trailing Zeroes

来源:互联网 发布:我国经济增长数据 编辑:程序博客网 时间:2024/06/14 08:29

题意是给一个数n,让你求出n的阶乘末尾0的个数,利用质因数分解可以将n的的阶乘看成多个质因数的幂相称的结果,其中,只有2和5相乘才会出现10,增加末尾零,因为2的个数远大于5,所以求末尾0的个数问题就转化为求n!中5的个数。

在n!中,只有5,10,15,20,25,30,35,40,45,50.。。。。这些5的倍数含有5,此为第一层。

在第一层中,25,50,75,,,,这些是5的多次幂,在第一层的基础上多包含了5

在第二层中,125,250,,,,,这些又在第二成的基础上多包含了5

.。。。。

依次递归求下去,可得求解函数。

题目链接

代码如下

class Solution {public:    int trailingZeroes(int n) {        int sum = 0;        for (long long i = 5; i <= n; i *= 5) {            sum += n/i;        }        return sum;    }};

第一次写的代码,,,用的是正着乘上去的思路,但是总是有点误差,而且数还挺大,原来卡了个边界,当n正好为int边界,临近n之下的i的极限乘上5之后会超出int范围,导致误差,把i的类型改为long long 便可以过了。

之后将写法改成边除边加的思路,可以规避这个边界问题。

class Solution {public:    int trailingZeroes(int n) {        int ans = 0;        while(n){            n /= 5;            ans += n;        }        return ans;    }};


原创粉丝点击