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

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

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

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

分析:
数字n的阶乘能够分解为素数幂的乘积,既n!=2^x*3^y.……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/(5^2)+n/(5^3)……直到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);
}
阅读更多

没有更多推荐了,返回首页