1-n之间的素数

1.常规思路:

给定n. 任取2<=i<=n,  设k=sqrt(i),若果2到k之间的数字全部都不能整除i,那么i就是素数。

2、埃拉托斯特尼筛法:

给出要筛数值的范围n,找出\sqrt{n}以内的素数p_{1},p_{2},\dots,p_{k}。先用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时,测试结果毫秒级




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值