求素数个数的优化-LeetCode204

问题

计数质数
统计所有小于非负整数 n 的质数的数量。

示例:

输入: 10
输出: 4
解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。

第一种解法容易想到但是会 超时

class Solution {
    public int countPrimes(int n) {
    	int counter = 0;
        for (int i = 2; i < num; i++) {
            if (isPrime(i)){
            // 是素数 counter++
                counter++;
            }
        }
        return counter;
    }
    // 判断是否是素数
    public boolean isPrime(int num){
        for (int i=2; i<num;i++){
            if(num%i==0){
                return false;
            }
        }
        return true;
    }

第二种用厄拉多塞筛法
实现原理

他造了一张1到50的素数表,首先写上1到50的所有自然数,然后先划去1,把2留下,再划去其他所有2的倍数,把3留下。再划去其他所有3的倍数,把5留下。又划去其他所有5的倍数……依此类推,可以得到50以内的所有素数。这就是著名的“厄拉多塞筛法”。

public static int countPrimes(int n) {
        boolean[] isPrime = new boolean[n];
        // 数组中全部设置成true
        Arrays.fill(isPrime, true);
        for (int i = 2; i * i < n; i++) {
            // 如果是素数,排除素数的倍数,因为素数的i倍就一定不是素数, i从2开始
            if (isPrime[i]) {
                // 让i从i平方开始,减少多余的计算,例如4x2 4x3之前都已经在2x4 3x4计算过了
                for (int j = i * i; j < n; j += i) {
                    isPrime[j] = false;
                }
            }
        }
        int count = 0;
        for (int i = 2; i < n; i++) {
            //最终从2开始计算素数,如果是就++
            if (isPrime[i]) {
                count++;
            }
        }
        return count;
    }
posted on 2020-09-18 15:34  青山是谁  阅读(15)  评论(0编辑  收藏  举报