leetcode:172. Factorial Trailing Zeroes

172. Factorial Trailing Zeroes

Description

Given an integer n, return the number of trailing zeroes in n!.

Example 1:

Input: 3
Output: 0
Explanation: 3! = 6, no trailing zero.
Example 2:

Input: 5
Output: 1
Explanation: 5! = 120, one trailing zero.
Note: Your solution should be in logarithmic time complexity.

Answer



func trailingZeroes(n int) int {
    ret := 0
    for n != 0 {
        ret += n / 5
        n /= 5
    }
    return ret

}

答案参考详解https://blog.csdn.net/zyh2525246/article/details/53697136


阶乘数小的时候可以直接计算。
例如:求10!后面零的个数。很明显结果为3628800。   0的个数为2个。
    20!结果为2432902008176640000,0的个数为4个。而这个时候已经达到19位数了。
    更大的数,如果再直接去求。显然太麻烦了。
那么,在这里,介绍一种求阶乘结果后面零的个数的方法。
首先,出现零的情况就是 5 的倍数乘以偶数。
但是出现0的个数就不一定了,2*5=10 出现一个0。4*25=100会出现2个0。8*125=1000出现3个0.依次类推。
大家不难发现规律所在。4*25可以分解成2*5*2*5,8*125可以分解为2*5*2*5*2*5........
至于10,15,20 这些数 。 分解开,只会出现一个5,也就只会出现1个0。
至于50,75这些25的倍数,分解开,也只会出现2个5,与偶数相乘也只会出现2个0.
下面就是计算0的个数了。
上面也谈到了,偶数乘以5会出现一个0,乘以5的平方会出现2个0,乘以5的立方会出现3个0.
那么怎么计算阶乘里存在多少个5的倍数,25的倍数,125的倍数呢。而且,有个问题还需要注意,25,125也是5的倍数,125也是25的倍数。
例如 求100!后面0的个数。
由上所说的方法,是5的倍数的数有16(除去25的倍数),是25的倍数的数有4个,结果应该为16*1+4*2=24个0.
我们也可以换一种思维,出现一个5就是一个0,那么出现一个25就是2个0,如果5的倍数不排除25的倍数的话,每出现一个25的倍数,只加上1个0即可。
换句话说就是,0的个数就等于5的倍数的个数加上25的倍数的个数,即 20+4。
如果是求2016!后面0的个数呢?
同样按照上面的方法。
5的倍数个数为: 
2016/5 = 403个
25的倍数个数为: 
403/5 = 80个 
125的倍数的个数为:
80/5 = 16个
625的倍数的个数为: 16/5 = 3个。
所以可以得出2016!后面0的个数为:403+80+16+3 = 502个.
如何用代码又该如何实现呢?

很简单,用一个简单的循环就能解决,当然递归算法更好。这里我们就只贴循环的代码了。
Scanner scanner = new Scanner(System.in);System.out.print("请输入阶乘数:");int a = scanner.nextInt();int count = 0;for (; ;) {a = a/5;if (a == 0) {break;}else {count+= a;}}System.out.println("阶乘结果后面的零的个数为:"+count);
结果如下:
请输入阶乘数:2016
阶乘结果后面的零的个数为:502


---------------------

本文来自 今安在 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/zyh2525246/article/details/53697136?utm_source=copy 

推荐阅读更多精彩内容