1,普通判断素数 (O(n*根号n))
package 备赛课.基础2;
import java.util.Scanner;
public class 素数 {
public static void main(String[] args) {
// Scanner sc = new Scanner(System.in);
// int n = sc.nextInt();
int count = 0;
boolean flag =true;
for (int j = 1;j<55;j++) { //输入规模
for (int i = 2; i<=Math.sqrt(j); i++) {
if (j%i==0) {
flag= false;
break;
}
}
if(flag) {
System.out.println(j);
count++;
}
flag= true;
}
System.out.println(count);
}
}
2,欧拉筛法O(n)
核心:每个和数只被其最小的素因子筛一次。
例如:30 = 2*3*5 所以 30:1, 2, 3,5 ,6,10 ,15,30,所以只用最小的2筛一遍,不用把3和5再去筛。
欧拉筛需要两个数组:
一个放素数 prime,一个数组isprime存放下标对应的数是不是素数的倍数。
步骤:
1,先定义两个数组,prime 用于存储所有素数,isp存储是否是素数的倍数默认全不是素数的倍数(false),注意isp长度 多加是为了防止溢出。
2,从2~n的循环进行筛选,把isp是false的数全部存起来
3,把已经存入的素数并且素数倍数小于n的数标记为和数,且判断一次就行。
代码:
package 备赛课.基础2;
import java.util.Scanner;
public class 素数_欧拉筛法 {
//”时间复杂度o(n)
//核心 :每个合数只被其最小的数因子筛选一次 30=2*3*5
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入你的数字:");;
int max =sc.nextInt();
int [] prime = new int[max];//存储所有的素数
boolean [] isp = new boolean[max+5];
int count = 0 ;
for(int i =2 ;i<=max;i++){
if(isp[i]==false) prime[count++] =i; //把当前的素数i放到prime数组第count个位置,然后count+1
for(int j = 0 ;j <count&& i*prime[j]<=max ; j++){
isp[i*prime[j]]=true; //primep[j]素数的i倍一定不是素数
if(i%prime[j]==0) break; //如果i是12那么在2的时候就已经被判断不是素数了,就不用在判断3了,相当于操作去重
}
}
System.out.printf("从1到%d 共有%d 个素数",max,count);
}
}
3,埃式筛法:O (N ln ln N)
把1~n的素数都标记为和数.
步骤:
1,先开辟个两个数组prime 用于存储素数,isp长度+1,用于判断是否是素数,默认全是素数(true)。
2,isp数组排除0,1两个元素。
3,然后定义个2~n的循环,用isp判断是否为true,为true 进入进入一个i*j<=n的循环,把isp[i*j](素数的倍数一定是和数),标记为和数。
4,然后再有个2~n的循环判断isp那个元素为真假,统计素数个数
package 备赛课.基础2;
import java.util.Arrays;
import java.util.Scanner;
public class 素数_埃氏筛法 {
// 埃氏筛法
public static void main(String[] args) {
Scanner sc =new Scanner(System.in);
int num = sc.nextInt();
boolean isprime [] = new boolean[num+1];
Arrays.fill(isprime,true);//假设都是素数
isprime[0]=isprime[1]=false;//0和1都不是素数,不是素数初始化为false;
for(int i =2 ; i*i<=num;i++){
if(isprime[i]==true){//如果是素数只有1和本身相乘才能得到 ,所以这里得到的全不是素数
for(int j = 2 ; i*j<=num;j++){//是i的倍数全部标记为flase
isprime[j*i]=false;
}
}
}
int count = 0 ;
for(int i =2; i<=num;i++){
if (isprime[i]==true){
count++;
}
}
System.out.println(count+"");
}
}