欧拉筛
核心思想
和数只被它最小的质因数筛去
prime_number
是当前小于i
的所有质数集合
p
是prime_number
的元素,当没有找到最小质因数pi
时,p
是j
的最小质因数,j
可以被筛去,当找到最小质因数时就要退出循环,否则不能保证p
是j
的最小质因数
算法的时间复杂度: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;}
}