筛质数

103 阅读1分钟

思路

质数定义 (从 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);
    }
}