求质数的几种方式

简介: 求质数的几种方式

在刷题过程中,遇到了寻找小于等于k的所有质数,来记录下通用的两个常见解法:

1. 开方降低时间复杂度


class Solution {
    public int countPrimes(int n) {
        int ans = 0;
        for (int i = 2; i < n; ++i) {
            ans += isPrime(i) ? 1 : 0;
        }
        return ans;
    }
    public boolean isPrime(int x) {
        for (int i = 2; i * i <= x; ++i) {
            if (x % i == 0) {
                return false;
            }
        }
        return true;
    }
}

2. 埃氏筛法


// 如果 x 是质数,那么大于 x 的 x 的倍数 2x,3x,… 一定不是质数,因此我们可以从这里入手。
// 从最小的质数开始,从小到大遍历每个数,如果这个数为质数,则将其所有的倍数都标记为合数(除了该质数本身),
class Solution {
    public int countPrimes(int n) {
        int[] isPrime = new int[n];
        Arrays.fill(isPrime, 1);
        int ans = 0;
        for (int i = 2; i < n; ++i) {
            if (isPrime[i] == 1) {
                ans += 1;
                if ((long) i * i < n) {
                    for (int j = i * i; j < n; j += i) {
                        isPrime[j] = 0;
                    }
                }
            }
        }
        return ans;
    }
}

3. 线性筛


// 优化的目标是让每个合数只被标记一次
class Solution {
    public int countPrimes(int n) {
        List<Integer> primes = new ArrayList<Integer>();
        int[] isPrime = new int[n];
        Arrays.fill(isPrime, 1);
        for (int i = 2; i < n; ++i) {
            if (isPrime[i] == 1) {
                primes.add(i);
            }
            for (int j = 0; j < primes.size() && i * primes.get(j) < n; ++j) {
                isPrime[i * primes.get(j)] = 0;
                if (i % primes.get(j) == 0) {
                    break;
                }
            }
        }
        return primes.size();
    }
}


相关文章
|
2月前
|
机器学习/深度学习
一个偶数总能表示为两个素数之和
【10月更文挑战第10天】一个偶数总能表示为两个素数之和。
20 2
|
7月前
|
Python
如何判断一个数是质数? 要求:编写一个Python函数,输入一个整数,输出该整数是否为质数。质数是指大于1的自然数中,除了1和它本身以外不再有其他因数的数。
如何判断一个数是质数? 要求:编写一个Python函数,输入一个整数,输出该整数是否为质数。质数是指大于1的自然数中,除了1和它本身以外不再有其他因数的数。
381 1
|
7月前
62.编程求所有的三位素数,且要求该数是对称数
62.编程求所有的三位素数,且要求该数是对称数
48 0
|
7月前
|
机器学习/深度学习
一个偶数总能表示为两个素数之和。
一个偶数总能表示为两个素数之和
39 0
判断10-105之间有多少个素数,并输出所有素数。【素数又称为质数,定义为在大于1的 自然数中,除了1和它本身以外不再有其他因数的数
判断10-105之间有多少个素数,并输出所有素数。【素数又称为质数,定义为在大于1的 自然数中,除了1和它本身以外不再有其他因数的数
108 0
判断是否是质数
判断是否是质数
68 0
输出100以内的素数(质数)
输出100以内的素数(质数)
186 0
质数练习_第一次优化
质数练习_第一次优化自制脑图 性能优化方法:基本方法,在 IDLE 中演示,使用 break 进一步优化
66 0
质数练习_第一次优化
求自定义范围内的素数(质数)
判定数字是质数需要循环判断 因此需要定义(flag)用于记录循环的结果 结果如图
93 0
求自定义范围内的素数(质数)
给出L,R求[L,R]内相距最近的素数对,和最远的素数对。如果有同样的,输出靠前的一对
给出L,R求[L,R]内相距最近的素数对,和最远的素数对。如果有同样的,输出靠前的一对
92 0