2、尾部的零

问题描述:

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

样例

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

这个问题相信很多老铁都已经遇到过了,很经典的一个题目,还是那句老话,重要的是考虑的过程,是如何想到以5的个数来统计0的个数呢?又是如何想到除以25、除以125... ...的呢?这些事重点。

首先n!中,哪些数字相乘可能会出现0呢,最简单的也是最根本的2*5(即使是10、20... ...也是由2*5构成的呀),而2的个数太多,所以只需要去统计5的个数,因为5的个数决定了0的个数。具体分析见代码注释。

#include <iostream>
using namespace std;
/*
1、 每隔 5个,会产生一个0,比如 5, 10 ,15,20.。。
2 、每隔 5×5 个会多产生出一个0,比如 25,50,75,100 (比如说25,在统计5的个数时,只计数了一次5的个数,但实际上25由两个5组成,少统计一个5,在这里再统计一遍能被25整除的个数补上。)
3 、每隔 5×5×5 会多出一个0,比如125.(道理同上)
... ...
*/
long long trailingZeros(long long n)
{
// 统计5的个数
long long m = 5;
long long count = 0;
while (n / m > 0)
{
cout << " n / m : " << n / m << endl;
count += n / m;
m *= 5;
}
return count;
}
int main ()
{
cout << trailingZeros(52) << endl;
system("pause");
return 0;
}

在LintCode上测试通过,AC100%.

注意我一开始在定义时m和count定义为int型,但是不能全部AC,因为int和long long表示的数长度不一样,所以还是要注意。

在这里就顺便复习下int和long long表示整数时的区别:int 2147483648~2147483647; long long :-9223372036854775807~9223372036854775808

有什么意见欢迎留言,您的支持是我最大的努力~


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值