LintCode 2. Trailing Zeros

LintCode 2. Trailing Zeros


Write an algorithm which computes the number of trailing zeros in n factorial.

题意分析

n!末尾含零的个数,这个题关键在于n!有多少5,2*5=10,每凑成一对就多一个0,2的个数远比5多,所以关键是找5.

可以列出几个例子来观察一下:
1 * 2 * 3 * 4 * (5) * 6 * 7 * 8 * 9 * (10) * 11 * 12 * 13 * 14 * (15) * 16 * 17 * 18 * 19 * (20) * 21 * 22 * 23 * 24 * ((25)) * 26 * 27 * 28 * 29 * (30)

  1. 每5个数有一个5结尾的,那么 n/5 便是5结尾数的个数,如 31/5 = 6,分别对应【5, 10, 15,20, 25, 30】
  2. 注意! 25可以分成5 * 5, 所以又多了一个5.
  3. 诸如25,125之类的数字有不止一个5。处理这个问题也很简单,首先对n÷5,可将上述转换为【1, 2, 3, 4,(5),6】
  4. 我们可以形象的看作在算括号个数,如((25)), ((50)), ((75)), ((100)), (((125))),这种5^i×j的数都会套多层括号,n每次除以5都会去一层括号,直至括号去完。
class Solution {
public:
    /*
     * @param n: A long integer
     * @return: An integer, denote the number of trailing zeros in n!
     */
    long long trailingZeros(long long n) {
        // write your code here, try to do it without arithmetic operators.
        long long num = 0;
        while (n) {
            num += n / 5;
            n /= 5;
        }
        return num;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值