目录
一试除法
二埃氏筛
三线性筛(欧拉筛)
一试除法
思想:就是判断某个数x是不是素数,就判断从2开始到小于=根号x的范围内有没有能够取余不等于0的,这个说明当前值就是x的一个因子,所以不是素数。
代码:
import java.util.Scanner;public class Javava {public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.println("求0~300之间的素数:");pan1();//试除法sc.close();}private static void pan1() {int total = 0;for (int i = 2; i <= 300; i++) {int j;for( j = 2; j*j <= i; j++) {if(i%j==0){break;}}if(j*j>i){System.out.println(i+" ");total ++;}}System.out.println("共有"+total+"个");}
}
二埃氏筛
思想:从小到大开始判断素数,当前x是素数,那么x*x 及以后得x*x+n*x都不在会是素数了,直接排除即可,使用一个boolean型的辅助数组即可
代码:
import java.util.Scanner;public class Javava {public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.println("求0~300之间的素数:");pan2();//埃氏筛sc.close();}private static void pan2() {int total = 0;boolean [] arr = new boolean[300];for (int i = 2; i < arr.length; i++) {if(arr[i]==false){for(int j=i*i;j<arr.length;j+=i){arr[j]=true;}}}System.out.println("素数有");for (int i = 2; i < arr.length; i++) {if(arr[i]==false){System.out.print(i+" ");total++;}}System.out.println();System.out.println("共有"+total+"个");}
}
三线性筛(欧拉筛)
思想:因为第二个埃氏筛有重复标记的,也是浪费性能,线性筛是对埃氏筛的进一步优化
代码:
ArrayList
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;public class Javava {public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.println("求0~300之间的素数:");pan3();//欧拉筛sc.close();}private static void pan3() {int total = 0;boolean [] arr = new boolean[301];ArrayList<Integer> list = new ArrayList<>();for (int i = 2; i < arr.length; i++) {if(arr[i]==false)list.add(i);for(int j=0;j<list.size()&&i*list.get(j)<=300;j++){arr[i*list.get(j)]=true;if(i%list.get(j)==0){break;}}}System.out.println("素数有");for(int val:list){System.out.print(val+" ");}System.out.println();System.out.println("共有"+list.size()+"个");}
}
二:纯粹数组
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;public class Javava {public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.println("求0~300之间的素数:");pan3();//欧拉筛sc.close();}private static void pan3() {int total = 0;boolean [] arr = new boolean[301];
// ArrayList<Integer> list = new ArrayList<>();int [] list = new int[301];int idx = 0;for (int i = 2; i < arr.length; i++) {if(arr[i]==false)list[idx++] = i;for(int j=0;j<=idx&&i*list[j]<=300;j++){arr[i*list[j]]=true;if(i%list[j]==0){break;}}}System.out.println("素数有");for(int val:list){System.out.print(val+" ");}System.out.println();System.out.println("共有"+(idx)+"个");}
}