一个有意思的题

1.阶乘尾数

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

一个有意思的题_第1张图片

分析:题目也是一看就懂,肯定大部分是先算出和sum,再用string::find_last_not_of('0'),然后会发现输入30就溢出了,那么难道用字符串吗,之前有个题目:字符串相加,但是这个乘法的自实现麻烦,其实尾数的'0' 是2 * 5 得来的,那么只要看有多少对2 和5 就行了,2又是比5 多,那么只要看5 的个数就行

代码实现:

解1:


class Solution {
public:
    int trailingZeroes(int n) {
        int count = 0;
        long long i = 5;
        while (i <= n) {
            int tmp = i;
            while(tmp % 5 == 0)
            {
                count++;
                tmp /= 5;
            }
            i += 5;       
        }
        return count;
    }
};

第一:这个i 从5 开始,然后+=5,不然会超出时间限制

第二:i的类型必须是longlong,因为下面的 i += 5 会超越INT_MAX,这个tmp用int类型即可,不会越界,因为i <= n 才会被赋值,n又是int

解2:

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

问题:这样为什么就可以数出5 的个数?它只有一个n 啊,不应该是 1 ~ n 都要遍历一遍吗?

这段代码是gpt写的,刚开始大家可能都和我有一样的问题,但是仔细分析,这代码实在是妙,我是这么理解的:这里n其实就是最后一个值,就是1 ~ n 就是n 个数,比方说n = 30

一个有意思的题_第2张图片

它第一步count += n / 5,就是这里的5, 10, 15, 20, 25, 30,这6个数有5的因子,以5步为一次,正好有6次,如果n = 31,32,33,34,也是一样的,这里还算好理解的,下面这个抽象了。我们一般的理解,按道理说这里的另一个因子应该来自25,可是n /= 5 是5啊,和25有什么联系,怎么只有5个数了,这时候n是数的个数,还是值?

一张图带你直接懂

一个有意思的题_第3张图片

这里的 /5 是每个数,实际上另一个因子5 ,也是来自25的

你可能感兴趣的:(c++,算法,c语言,开发语言,leetcode)