LeetCode每日一题 (60) 204. 计数质数(制表法:素数的判定)

204. 计数质数


在这里插入图片描述


方法一:枚举

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

在这里插入图片描述


方法二:制表法(重点

  1. 首先将所有的数都设置为素数(标记为1);
  2. 从第一个素数2开始到n遍历,如果当前的数为素数,那么result+1,并且将素数的倍数全部设置为不是素数(标记为0);

下面有两组代码,k从i开始是优化的,从2开始也可以,只不过这样有点重复(比如一个数x=2*i,这个数是i的倍数,同样也是2的倍数呀,那这个x就在i=2的时候就已经设置过了)。

for(int k=i;(long long)i*k<n;k++){
    
    
     isprime[i*k]=0;
}  
class Solution {
    
    
public:
    int countPrimes(int n) {
    
    
        vector<int>isprime(n+1,1);
        int result=0;
        for(int i=2;i<n;i++){
    
    
            if(isprime[i]==1){
    
    
                result++;
                for(int k=2;i*k<n;k++){
    
    
                    isprime[i*k]=0;
                }
                // for(int k=i;(long long)i*k<n;k++){
    
    
                //     isprime[i*k]=0;
                // }  
            }
        }
        return result;
    }
};

在这里插入图片描述


这两天天气有点冷,感觉快感冒了

猜你喜欢

转载自blog.csdn.net/qq_45021180/article/details/110525965