素数模版
欧拉筛和埃氏筛法求素数模版
public class Prime { public boolean[] visit; //true代表不是素数,false代表是素数 public int[] prime; //记录着每一个质数值 public int cnt = 0; //记录质数的个数 //欧拉筛的时间复杂度O(n),每个数只筛一次,使用最小的质因子去筛 public void Euler(int n) { visit = new boolean[n + 1]; prime = new int[n + 1]; visit[1] = true; //true不是质数 for (int i = 2; i <= n; ++i) { if (visit[i] == false) //判定是否为素数 prime[++cnt] = i; //i是一个素数,存入prime数组中 for (int j = 1; j <= cnt && i * prime[j] <= n; ++j) { //用已得到的素数去筛,并且不越界 visit[i * prime[j]] = true; //将最小质因子是prime[j]的数筛掉 if (i % prime[j] == 0) break; //如果prime[j]是i的最小质因数,则直接结束循环(如果不结束就会重复筛) } } } //埃氏筛法有重复筛同一个数,时间复杂度为O(n*log(log(n))) void Eratosthenes(int n) { prime = new int[n + 1]; for (int i = 2; i <= n; i++) { if (prime[i] == 0) prime[++prime[0]] = i; for (int j = 1; j <= prime[0] && prime[j] <= n / i; j++) { prime[prime[j] * i] = 1; if (i % prime[j] == 0) break; } } cnt = prime[0]; } public static void main(String[] args) { Prime p = new Prime(); p.Euler(100); for (int i = 1; i <= p.cnt; i++) { System.out.print(p.prime[i] + ","); } p.Eratosthenes(100); for (int i = 1; i <= p.cnt; i++) { System.out.print(p.prime[i] + ","); } } }