计数质数

2020-07-17  本文已影响0人  面向全麦面包编程

计数质数

判断一个素数很简单,代码如下,但如何高效的搜寻一个区间内的所有素数呢?

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

一个数若是可以因式分解,那么得到的两个数一定是一个大于等于√n,一个小于等于√n,所以只需遍历到√n即可
说回正题,我们要做的不是判断区间内所有数是不是素数,而是筛选结果,意思是我们判断出2是素数,那么2的倍数都不可能是素数,如果我们用一个布尔数组/集合来保存结果,那么在 k=2i,3i······ 的位置上皆为false

    public int countPrimes(int n) {
        if (n < 2) return 0;
        List<Boolean> isPrimes = new ArrayList<Boolean>
                (Collections.nCopies(n, true));
        isPrimes.set(0, false);
        isPrimes.set(1, false);
        int count = 0;
        for (int i = 2; i < n; i++) {
            if (isPrimes.get(i)) count++;
            for (int j = i; j < n; j += i) {
                isPrimes.set(j, false);
            }
        }
        return count;
    }

Tips:

上一篇下一篇

猜你喜欢

热点阅读