要求:
设计一个算法,计算出n阶乘中尾部零的个数
示例:
11! = 39916800,因此应该返回 2
代码:
1 package main 2 3 import "fmt" 4 5 func main() { 6 var n int = 25 7 res := zero(n) 8 fmt.Printf("%v的阶乘末尾有%v个零", n, res) 9 } 10 11 /** 12 * 查找n的阶乘末尾有几个零 13 * 最小的末尾带零的数就是10了,10=2*5(每一对2,5就会产生一个0) 14 * 问题就转化为n!中有多少对2,5 15 * 进一步转化为n!拆分的因子中有多少个5(2出现的频率比5高的多得多,即使没有2也会有4,6,8,总之只要有偶数就能拆分出2) 16 * 25: 5*5*2*2 = 100 产生2个零 17 * 125: 5*5*5*2*2*2 = 1000 产生三个零 18 * 依次类推5的m次方会产生m个零 19 */ 20 func zero(n int) int { 21 var count int 22 if(n < 5) { 23 return count 24 } 25 for i:=5;i<=n;i+=5 { 26 tmp := i 27 for tmp>=5 { 28 if tmp%5 == 0 { 29 count++ 30 tmp /= 5 31 } 32 } 33 } 34 return count 35 }