- 计数质数
题目
统计所有小于非负整数 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=ii。另外由于是标记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
}