Leetcode204 计算质数

175 阅读1分钟

暴力法简单实时超时,第二种埃式筛比较巧妙。

初始化长度 O(n)的标记数组,表示这个数组是否为质数。数组初始化所有的数都是质数. 从 2 开始将当前数字的倍数全都标记为合数。标记到根号n时停止即可。

image.png

class Solution {
    //暴力法
    public int countPrimes(int n) {
        if(n<2) return 0;
        int res = 0;
        for(int i=2;i<n;i++){
            res+= isPrime(i)?1:0;
        }
        return res;
    }

    public boolean isPrime(int x){
        for(int i=2;i*i<=x;i++){
            if(x % i==0) return false;
        }
        return true;
    }

    //埃式筛
    public int countPrimes(int n) {
        if(n<2) return 0;
        boolean[] isPrime = new boolean[n];
        Arrays.fill(isPrime,true);
        for(int i=2;i*i<n;i++){
            if(isPrime[i]){
                for(int j=i*i;j<n;j+=i){
                    isPrime[j] = false;
                }
            }
        }
        int res = 0;
        for(int i=2;i<n;i++){
            res+=isPrime[i]?1:0;
        }
        return res;
    }
}

详情参考