本篇文章主要思路来源于博主辞树c的该篇文章
(174条消息) 【数论】求素数的三种方法_辞树c的博客-CSDN博客
该篇文章论述详细,可以先看完文章再来看java代码,如果有错误,请指出。
public class Prime { //测试 public static void main(String[] args) { is_prime2(20); is_prime3(20); } //试除法 public static boolean is_prime1(int n){ if (n<2) return false; // i<=n/i 也可以写成 i*i<=n 或者 i<Math.sqrt(n) for (int i = 2; i <= n/i;i++){ if (n%i == 0){ return false; } } return true; } //埃式筛法 public static void is_prime2(int nNum){ boolean[] st = new boolean[nNum+1]; int[] prime = new int[nNum+1]; int cnt = 0; for (int n = 2 ; n <= nNum;n++) { if (!st[n]) { if (!is_prime1(n)){ continue; } prime[cnt++] = n; for (int i = 2*n;i<=nNum;i+=n){ st[i] = true; } } } System.out.println(Arrays.toString(prime)); System.out.println(cnt); } //欧拉筛法 public static void is_prime3(int nNum){ boolean[] st = new boolean[nNum+1]; int[] prime = new int[nNum+1]; int cnt = 0; for (int i = 2;i <= nNum;i++){ if (is_prime1(i) && !st[i]) prime[cnt++] = i; for (int j = 0; prime[j]<=nNum/i;j++){ st[prime[j]*i] = true; if (i % prime[j] == 0) break; } } System.out.println(Arrays.toString(prime)); System.out.println(cnt); } }