204 计数质数 golang

  1. 计数质数

题目

统计所有小于非负整数 n 的质数的数量。

示例:

输入: 10
输出: 4
解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。

我的解答

这道题要做出来很容易。用一个bool切片来记录是不是质数,然后数一遍true个数就行了,不过关于两层循环的边界值得多考虑一下。
素数不是1和自身之外的数字的倍数。
因此用i从2开始,把2的倍数,3的倍数,4的倍数…都标记为非质数。
举个例子,求countPrimes(90):
当你把9的倍数都剔除了,还需要考虑10的倍数吗?
不需要了,因为前面的数字都和10乘过了,再剔除倍数只能剔除10x10,10x11,但这些都是大于90的。因此这里i的边界是i<sqrt(n),用ii<n就不用import math了。
再来看j,还是考虑countPrimes(90):
加入你已经标记完了2,3,4的倍数,现在i=5,那么2x5,3x5,4x5都已经标记过了,因此j的下界是j=i
i。另外由于是标记i的倍数,因此每次递增的步子可以迈大一点,j=j+i.
我寻思我这已经挺细了,但是结果一般般。
在这里插入图片描述

func countPrimes(n int) int {
	if n<2{
		return 0
	}
	var isPrime []bool
	for i:=0;i<n;i++{
		isPrime=append(isPrime, true)
	}
	for i:=2;i*i<n;i++{
		for j:=i*i;j<n;j=j+i{
			isPrime[j]=false
		}
	}
	cnt:=0
	for _,v:=range isPrime{
		if v==true{
			cnt++
		}
	}
	return cnt-2
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值