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

32位编译器和64位编译器数据字节数(一个字节=8位)
数据范围

编译器
int类型:4个字节32位(48),寻址空间为232,数据范围-231~2^31
long long类型:是一种超长整型,8字节64位(8
8),寻址空间为264数据范围-263~2^63

题目描述:
设计一个算法,计算出n阶乘中尾部零的个数
样例:11!=39916800,因此返回2

分析:
数字n的阶乘能够分解为素数幂的乘积,既n!=2x*3y.……5^z…
显然,2*5=10产生一个0,且2的个数大于5的个数既x>z,本题既求z的大小

1到n中5的倍数有5,10,15,20,25,30…50…,n/5为n中能被5整除的数的个数

5^2=25提供2个5,1到n中25的倍数有25,50,75,100……,n/25为n中能被5*5整除的数的个数,是25的倍数一定是5的倍数并在第一次查询时已经提供了一个5,因此在第二次查询时可以再提供(2-1)一个5

5^3=125提供3个5,1到n中125的倍数有125,250,……,n/125为n中能被125整除的数的个数,是125的倍数一定是5和25的倍数,在上两次查询时已经提供了2个5,因此在第3次查询是可以在提供(3-2)一个5

以此类推,z=n/5+n/(52)+n/(53)……直到n/(5^a)<0

代码如下:

long long trailingZeros(long long n){
	long long num;
	while(n)
	{
		num+=n/5;
		n/=5;
	}
	return num;
}

当condition为任意非零值时,既条件为真时,一直执行目标语句。

while(condition){
	statement(s);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值