n! 的结果中包含多少个0(Go语言实现)
详细解释见代码注释
package main
import (
"fmt"
)
type myInt int32
/*
*统计阶乘n!结果中0的个数
*方法1:统计5出现的次数
*如25出现了两个5
*因为任意一个偶数都可以和5组成10
*而且偶数的量是足够的
*/
func fZereCount1(n myInt) myInt {
var count, i myInt = 0, 0
//完全枚举
for ; n >= 5; n-- {
i = n
//i值是不会等于0的,所以无需加上&& i > 0
for i%5 == 0 {
count++
i /= 5
}
}
return count
}
/*
*方法1的第二种写法
*/
func fZereCount1x(n myInt) myInt {
var i, count, tmp myInt = 1, 0, 0
//部分枚举
for {
if 5*i <= n {
count++
tmp = i
//有可能i值也满足条件
for tmp%5 == 0 {
count++
tmp /= 5
}
i++
} else {
return count
}
}
return count
}
/*
*方法2:快速统计
/*例如:199
*count=[199/5]+[199/5/5]+[199/5/5/5]
*解释:[199/5]即求得199内有多少个可以被5整除(取整)
* [199/5/5]即求得199内有多少个可以被25整除(取整)
* [199/5/5]即求得199内有多少个可以被125整除(取整)
*特殊数字:如125,既可以被5、25还可以75整除,所以需要被统计3次
*综上所述:此法本质上还是在统计5的个数
*/
func fZereCount2(n myInt) myInt {
var count, tmp myInt = 0, 0
for {
tmp = n / 5
if tmp > 0 {
n = tmp
count += tmp
} else {
return count
}
}
return count
}
/*
*代码作者:天之 博客:http://blog.csdn.net/WAPWO?viewmode=contents
*/
func main() {
fmt.Println(fZereCount1(10000))
fmt.Println(fZereCount1x(10000))
fmt.Println(fZereCount2(10000))
}