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)) }
有疑问加站长微信联系(非本文作者)