n! 的结果中包含多少个0(Go语言实现)

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))
}

 

点赞