思路
质数定义 (从 2 开始定义 到无穷大 )
<= 1 既不是质数 也不是合数
大于1 的正数中,只包含1 和本身这两个约数,被称为质数
如何筛
从 2~p-1 中 依次删除 2 ~ p-1 的倍数、都没有删掉P的话 那么 p 就是质数
import java.util.*;
import java.io.*;
public class Main {
static int n;
static int[] arr;
static boolean[] st;
public static void main(String[] args) {
Scanner sc = new Scanner(new BufferedInputStream(System.in));
n = sc.nextInt();
// 质数表
arr = new int[n + 1];
st = new boolean[n + 1];
getAns(n);
System.out.println();
}
static void getAns(int n) {
int cnt = 0;
for (int i = 2; i <= n ; i ++){
if (!st[i]) {
arr[cnt ++] = n;
}
for (int j = i + i ; j <= n ; j = j + i) st[j] = true;
}
System.out.print(cnt);
}
}
优化 因为合数 等于 两个质数的乘积 可以用质数来筛掉所有合数。(埃氏筛法)
import java.util.*;
import java.io.*;
public class Main {
static int n;
static int[] arr;
static boolean[] st;
public static void main(String[] args) {
Scanner sc = new Scanner(new BufferedInputStream(System.in));
n = sc.nextInt();
// 质数表
arr = new int[n + 1];
st = new boolean[n + 1];
getAns(n);
System.out.println();
}
static void getAns(int n) {
int cnt = 0;
for (int i = 2; i <= n ; i ++){
if (!st[i]) {
arr[cnt ++] = n;
for (int j = i + i ; j <= n ; j = j + i) st[j] = true;
}
}
System.out.print(cnt);
}
}