1.常规思路:
给定n. 任取2<=i<=n, 设k=sqrt(i),若果2到k之间的数字全部都不能整除i,那么i就是素数。
2、埃拉托斯特尼筛法:
给出要筛数值的范围n,找出以内的素数。先用2去筛,即把2留下,把2的倍数剔除掉;再用下一个质数,也就是3筛,把3留下,把3的倍数剔除掉;接下去用下一个质数5筛,把5留下,把5的倍数剔除掉;不断重复下去......。
实现代码:
public class sushu {
public static void main(String[] args) {
// TODO Auto-generated method stub
int n=300000;
long t1=System.currentTimeMillis();
primeFilte(n);
long t2=System.currentTimeMillis();
Eratosthenes(n);
long t3=System.currentTimeMillis();
System.out.println(t2-t1);
System.out.println(t3-t2);
System.out.println(isPrime(n));
}
//埃拉托斯特尼筛法:
private static int Eratosthenes(int n) {
// TODO Auto-generated method stub
int num=0;
boolean filter[]=new boolean[n+1]; //0,1这两个下标废弃不用,因为素数是从2开始的
for (int i = 2; i <=n; i++) {
filter[i]=true; //初始化为true
}
for (int i = 2; i <=Math.sqrt(n); i++) {
if (filter[i]) {
int j=i<<1; //先翻倍
while(j<=n){
if (filter[j]) {
filter[j]=false; //j是i的倍数,所以不是素数,标志位flase
}
j+=i; //分别变成3i,4i......
}
}
}
for (int i = 2; i <= n; i++) {
if (filter[i]) {
//System.out.println(i+" "); 不打印是为了测试性能,打印消耗时间,若果你想看到具体素数那就注释掉
num++;
}
}
return num;
}
//判断是不是素数
public static boolean isPrime(int n) {
// TODO Auto-generated method stub
int k,j=0,i=n;
k=(int) Math.sqrt(i);
for ( j = 2; j <=k; j++) {
if (i%j==0) break;
}
if (j>k) {
return true;
}
return false;
}
//常规解法
private static int primeFilte(int n) {
int i,j,k,num=0;
for (i = 2; i <=n; i++) {
k=(int) Math.sqrt(i);
for (j = 2; j <=k; j++) {
if (i%j==0) {
break;
}
}
if (j>k) {
// System.out.println(i+" "); 不打印是为了测试性能,打印消耗时间,若你想看到具体素数那就注释掉
num++;
}
}
return num;
}
}
测试结果:
n=30W时,测试结果毫秒级