GuilinDev

Lc0204

05 August 2008

204 Count Primes

原体概述

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

Example:

1
2
3
Input: 10
Output: 4
Explanation: There are 4 prime numbers less than 10, they are 2, 3, 5, 7.

题意和分析

这道题比较简单,给一个非负整数n,找到小于n的所以素数,不包括n自己。正常的做法就是从2循环到n-1,每个数都判断下是否是素数,判断是否是素数的办法如下:

1
2
3
4
5
6
7
8
9
10
11
//判断一个数是否是质数(素数)
public boolean isPrimeNumber(int num){
    if(num == 2) return true;//2特殊处理
    if(num < 2 || num % 2 == 0) return false;//识别小于2的数和偶数
    for(int i=3; i<=Math.sqrt(num); i+=2){//从3开始,到平方根结束,每次+2,因为偶数肯定不是质数
        if(num % i == 0){//识别被奇数整除
            return false;
        }
    }
    return true;
}

在Discuss区看到一个空间换时间的做法(https://leetcode.com/problems/count-primes/discuss/57588/My-simple-Java-solution),从2开始遍历,然后每次遇到质数的时候就开始计算后面的数字,标记true或者false,因为如果是合数则一定可以被前面的数乘以得到(证明略),接下来遇到即可直接判断。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution {
    public int countPrimes(int n) {
        if (n < 2) {
            return 0;
        }
        boolean[] notPrime = new boolean[n];
        int count = 0;
        for (int i = 2; i < n; i++) {
            if (notPrime[i] == false) {//default值为false
                count++;
                for (int j = 2; i*j < n; j++) {//j从2开始
                    notPrime[i*j] = true;
                }
            }
        }
        return count;
    }
}