AcWing 868. 筛质数
原题链接
简单
作者:
巨鹿
,
2020-03-04 12:02:07
,
所有人可见
,
阅读 653
import java.util.*;
public class Main {
static int N = 1000010;
static boolean st[] = new boolean[N];
static int p[] = new int[N];
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int cnt = 0;
for (int i = 2; i <= n; i++) {
if (!st[i])
p[cnt++] = i;
for (int j = 0; p[j] <= n / i; j++) {// 此处n/i是为了防止越界
st[p[j] * i] = true;
if (i % p[j] == 0)
break;
/**
* 此处break的原因:还是一个数只能被他的最小质因数筛去
* 例如:i=6时,6%2==0本该在第一轮break;
* (就像6包含2,其他质数和6组合,就违背了最小质数原则)
* 但是假如不break;就会把st[3*6]筛去,而18只能被2筛
*/
}
}
System.out.println(cnt);
}
}