思路: 利用 prime 的倍数 一定不是prime , 来进行线性的剔除。
易错点:刚开始时候要先把全部初始化为true, 获取下一个prime 时候 一定要先 prime++;
package PrimeNumber;
public class Solution {
public boolean[] getPrime(int max) {
boolean[] ret = new boolean[max + 1];
if (max < 1)
return ret;
for (int i = 0; i <= max; i++) {
ret[i] = true;
}
int prime = 2;
while (prime <= max) {
crossOff(ret, prime);
prime++;
while (prime <= max && !ret[prime]) {
prime++;
}
}
return ret;
}
private void crossOff(boolean[] ret, int prime) {
for (int i = prime * prime; i < ret.length; i += prime) {
ret[i] = false;
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Solution solution = new Solution();
boolean[] ret = solution.getPrime(20);
for (int i = 0; i <= 20; i++) {
if (ret[i])
System.out.print(i + ", ");
}
}
}