标签:
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时,测试结果毫秒级
标签:
原文地址:http://blog.csdn.net/u012150590/article/details/51351616