码迷,mamicode.com
首页 > 其他好文 > 详细

1-n之间的素数

时间:2016-05-12 22:22:14      阅读:118      评论:0      收藏:0      [点我收藏+]

标签:

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时,测试结果毫秒级

技术分享



1-n之间的素数

标签:

原文地址:http://blog.csdn.net/u012150590/article/details/51351616

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!