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

WAPWO · · 1680 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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

 


有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:WAPWO

查看原文:n! 的结果中包含多少个0(Go语言实现)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1680 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传