题目:
今天这题很简单啊,找质数嘛,谁不会呀
上来就是一个暴力算法,哦吼,超时了。
于是改进了一下,只遍历到sqrt(n),勉强能过
class Solution {
public:
bool isPrime(int x) {
for (int i = 2; i * i <= x; ++i) {
if (x % i == 0) {
return false;
}
}
return true;
}
int countPrimes(int n) {
int ans = 0;
for (int i = 2; i < n; ++i) {
ans += isPrime(i);
}
return ans;
}
};
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/count-primes/solution/ji-shu-zhi-shu-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
这里重点讲一下另一个方法
埃氏筛
思路是这样的:
1.我们去寻找一个质数,那么这个质数的所有倍数一定是合数。那么我们将这些合数直接置0,防止后面会遍历到。
2.那么我们从2X开始标记其实也是多余的,因为2X的数字早就被标记过了。比如6,就被2标记过,不需要3再去标记。所以直接从X*X开始标记可以进一步提升算法的效率。
C++代码:
class Solution {
public:
int countPrimes(int n) {
vector<int> isPrime(n, 1);
int ans = 0;
for (int i = 2; i < n; ++i) {
if (isPrime[i]) {//有没有被标记过
ans += 1;
if ((long long)i * i < n) {//从X*X开始标记
for (int j = i * i; j < n; j += i) {
isPrime[j] = 0;
}
}
}
}
return ans;
}
};
这次的题很简单,就不设计测试用例了。