您的位置:首页 > 其它

求解1到n之间素数的个数

2015-10-18 11:17 417 查看
常用方法:

package test;

import java.util.Scanner;

public class PrimeCount {
//判断一个数是否为素数的时间复杂度为O(sqrt(n))
boolean isPrime(int num){
if(num < 2)
return false;
int i = 2;
for(;i*i<=num;i++){
if(num %i==0)
break;
}
if(i*i >num)
return true;
return false;
}
public static void main(String[] args) {
PrimeCount pc = new PrimeCount();
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int count = 0;
for(int i =1;i<=n;i++){
if(pc.isPrime(i))
count++;
}
sc.close();
System.out.println(count);
}
}


上述算法的时间复杂度为O(n*sqrt(n));

2、埃拉托斯特尼筛法:

给出要筛数值的范围n,找出

以内的素数

。先用2去筛,即把2留下,把2的倍数剔除掉;再用下一个质数,也就是3筛,把3留下,把3的倍数剔除掉;接下去用下一个质数5筛,把5留下,把5的倍数剔除掉;不断重复下去......。



代码实现:
package test;

import java.util.Scanner;

public class PrimeCount {

int primeFilter(int num){
boolean array[] = new boolean[num+1];
for(int i = 2;i<=num;i++){
array[i] = true;
}
int count =0;//素数个数
for(int i=2;i*i<=num;i++){
if(!array[i])//不是素数
continue;
//将当期素数的倍数置为false,为合数
int j= i*2;
while(j<=num){
if(array[j])
array[j]= false;
j+=i;
}
}
for(boolean bool:array)
{
if(bool)
count++;
}
return count;
}
public static void main(String[] args) {
PrimeCount pc = new PrimeCount();
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int count = 0;
long start = System.currentTimeMillis();
count = pc.primeFilter(n);
long end = System.currentTimeMillis();
System.out.println("time use:"+(end-start));
sc.close();
System.out.println(count);
}
}
时间复杂度为O(n*loglog(n)),接近于线性时间
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: