leetCode 204 计数质数 : 厄拉多塞筛法求质数

1,822 阅读1分钟

通过此题了解了下厄拉多塞筛法求质数:如下图

该算法在寻找素数时,采用了一种与众不同的方法:先将 2-N 的各数放入表中,然后在 2 的上面画一个圆圈,然后划去 2 的其他倍数;第一个既未画圈又没有被划去的数是 3,将它画圈,再划去 3 的其他倍数;现在既未画圈又没有被划去的第一个数是 5,将它画圈,并划去5的其他倍数……依次类推,一直到所有小于或等于N的各数都画了圈或划去为止。

这时,表中画了圈的以及未划去的那些数正好就是小于 N 的素数。

因此代码如下:

public int countPrimes(int n) {
        //建立数组
        boolean[] nums = new boolean[n];
        
        //将2-N之间的数据设为true
        for (int i = 2;i<n;i++){
            nums[i] = true;
        }
        
        //将2、3、5等倍数的值“划去”(设为falsefor (int i = 2;i*i < n;i++) {
            if (nums[i]) {
                for (int j = 2;j*i<n;j++) {
                    nums[j*i] = false;
                }
            }
        }
        int res = 0;
        //最后取出为true的值,即为2-N之间画圈的数据
        for (boolean num : nums) {
            res+= num?1:0;
        }
        return res;
    }