public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int[] prim = new int[n]; boolean[] isp = new boolean[n]; // 质数为false,合数为true int count = 0; // i是boolean数组的指针 // j是prim数组的指针 for (int i = 2; i < isp.length; i++) { if (isp[i] == false) prim[count++] = i; for (int j = 0; j < count && i * prim[j] < n; j++) { // 保证素数的倍数不超过打表区间 isp[i * prim[j]] = true; // 质数的倍数一定是合数 if (i % prim[j] == 0) break; // 欧拉筛的核心 每个合数只被其最小的素因子筛一次 } } System.out.println(count); for (int i = 0; i < n; i++) {
if (prim[i] != 0) System.out.print(prim[i] + " "); }