质数筛——欧拉筛

欧拉筛

核心思想

和数只被它最小的质因数筛去

1prime_number是当前小于i的所有质数集合

pprime_number的元素,当没有找到最小质因数pi时,pj的最小质因数,j可以被筛去,当找到最小质因数时就要退出循环,否则不能保证pj的最小质因数

算法的时间复杂度:O(n),到n的所有和数只被其最小的质因数筛去

java代码

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        List<Integer> arr=PrimeNumber(n);
        for(int i=0;i<arr.size();i++){
            System.out.println(arr.get(i));
        }
    }

    public static List<Integer> PrimeNumber(int n){
        //存储当前的所有质数
        List<Integer> primes = new ArrayList<>();
        //记录当前数是否被筛去
        boolean[] isPrime = new boolean[n+1];
        Arrays.fill(isPrime, true);
        isPrime[1] = true;
        for (int i = 2; i <= n; i++) {
            if(isPrime[i]){primes.add(i);}
            for(Integer prime : primes) {
                if(i*prime >n)break;
                isPrime[i*prime] = false;
                if(i%prime == 0)break;
            }
        }
        return primes;
    }
}
posted @ 2025-03-30 16:51  狐狸胡兔  阅读(124)  评论(0)    收藏  举报