提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
题目
给定整数 n ,返回 所有小于非负整数 n 的质数的数量 。
示例 1:
输入:n = 10
输出:4
解释:小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。
示例2
输入:n = 10
输出:4
解释:小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。
示例 3:
输入:n = 1
输出:0
提示:
0 <= n <= 5 * 106
一、思路
埃拉托斯特尼筛法,简称埃氏筛或爱氏筛,是一种由希腊数学家埃拉托斯特尼所提出的一种简单检定素数的算法。要得到自然数n以内的全部素数,必须把不大于根号n的所有素数的倍数剔除,剩下的就是素数。
tips:如果一个数不是素数,则必然存在一个小于等于根号n和一个大于等于根号n的自然数相乘可得该数。
二、代码
代码如下(示例):
public class Solution {
public int CountPrimes(int n) {
int countPrime = 0;
//设定n个数默认均为false
bool[] isPrimes = new bool[n];
//素数为false,反之为true
for(int i=2;i<n;i++)
{
//如果是true 说明不是素数
if (isPrimes[i])
continue;//直接下一次循环
countPrime++;
//说明是素数,则删去他的倍数
for (int j = i; j < n;j=j+i)
isPrimes[j] = true;
}
return countPrime;
}
}
总结
有大佬作出改进:
原题链接
从i*i开始判断可以进一步提升效率
if ((long) i * i < n) {
for (int j = i * i; j < n; j += i) {
arr[j] = true;
}
}