统计质数

原题

  Description:
  Count the number of prime numbers less than a non-negative number, n.html

题目大意

  统计小于非负整数n的素数的个数。算法

解题思路

  使用见埃拉托色尼筛法。less

埃拉托色尼筛法,是一种公元前250年由古希腊数学家埃拉托色尼所提出的一种简单检定素数的算法。url

给出要筛数值的范围n,找出埃拉托色尼筛法之内的素数。先用2去筛,即把2留下,把2的倍数剔除掉;再用下一个素数,也就是3筛,把3留下,把3的倍数剔除掉;接下去用下一个素数5筛,把5留下,把5的倍数剔除掉;不断重复下去......。spa

 

举例:求25之内的全部素数.net

(1) 列出2之后的全部序列:code

2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25htm

(2) 标出序列中的第一个素数,也就是2,划去2的倍数(用红色标出)序列变成:blog

2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25ip

(3) 若是如今这个序列中最大数小于最后一个标出的素数的平方,那么剩下的序列中全部的数都是素数,不然回到第二步。本例中,由于25大于2的平方,咱们返回第二步:

(4) 剩下的序列中第一个素数是3,再将主序列中3的倍数划出(红色),主序列变成:

2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

(5) 咱们标出的素数有:2,3,当前25仍然大于3的平方,因此咱们还要返回第二步:

如今序列中第一个素数是5,一样将序列中5的倍数划出,主序列成了:

2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

(6) 由于25等于5的平方,跳出循环.

结论:去掉红色的数字,2到25之间的素数是:2 3 5 7 11 13 17 19 23

 

下图中:

2是第一个标出的素数为红色,2的倍数为浅红色

3是第二个标出的素数为绿色,3的倍数为浅绿色

5是第三个标出的素数为蓝色,5的倍数为浅蓝色

2,3,5,加上剩余的灰色数字就是所求的素数

 

埃拉托色尼筛法

代码实现

算法实现类

public class Solution {

    public int countPrimes(int n) {

        if (n <= 1) {
            return 0;
        }

        // 默认全部的元素值都会设置为false
        boolean[] notPrime = new boolean[n];
        notPrime[0] = true;
        notPrime[1] = true;

        for (int i = 2; i * i < n; i++) {
            // 若是i是一个质数,i将i的倍数设置为非质数
            // 如是i是一个合数,则它一定已经设置为true了,由于是从2开始处理的
            if (!notPrime[i]) {
                for (int j = 2 * i; j < n; j += i) {
                    notPrime[j] = true;
                }
            }
        }

        // 统计质数的个数
        int result = 0;
        for (boolean b : notPrime) {
            if (!b) {
                result++;
            }
        }

        return result;
    }
}
相关文章
相关标签/搜索