【算法】计算n阶乘中尾部0的个数

题目

设计一个算法,计算出n阶乘中尾部零的个数

样例 
11! = 39916800,因此应该返回 2

挑战 
O(logN)的时间复杂度

题目分析

n阶乘中,尾部出现的零是10和10的倍数相乘的结果,尾部出现多少个零,其实就是在n阶乘中有多少个10相乘,10的公因数除了1与10,就只剩下2与5,所以出现10其实是2与5相乘
因此,尾部出现的零就是5和偶数相乘的结果,在n阶乘中,偶数的个数要比5个数多得多,所以尾部零的个数就为多少个5相乘的个数(10看做2x5即一个5,25看做两个5…)

以n=100为例

1x2x3x4x5x6x7x8x9x.........x98x99x100

这些数中每5个数将会出现一个5的倍数,一共出现temp1 = 100/5 =20

5x10x15x20x25x30x......x90x95x100

我们将这些数提取出一个5

5(1x2x3x4x5....x17x18x19x20)

括号中20个数出现5的倍数的个数为temp2 = 20/5 =4

5x10x15x20

再提取5,此时括号已经没有5的倍数,即temp3 = 0

5(1x2x3x4)

所以总的个数为temp = temp1+ temp2 = 14
综上,程序循环到temp = 0时,程序结束
用C语言程序实现为

#include<stdio.h>
int main()
{
long num=0,temp;
        temp = n/5;
        while(temp!=0)
        {
            num = num+temp;
            temp = temp/5;
        }
        return 0;
}
  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值