【刷题篇】计算质数

一、题目

OJ链接
给定整数 n ,返回 所有小于非负整数 n 的质数的数量 .

二、题解

思路:将1~n-1上不是素数的数全部除去,剩下的数的数量就是素数

  1. 除了2,所有的偶数都不是素数,因为4=2x2;6=2x3;8=2x4…
  2. 在去除掉因子中含有3的所有不是素数的数,
    3x2不用再算了,因为计算2x3的时候算过了,所以对于数字i只需从 i x i 开始,3x3=9(不是素数), 3x4不用算(偶数),3x5=15(不是素数)…
 public int countPrimes1(int n) {
        if(n<3){
            return 0;
        }
        boolean[] f=new boolean[n];
        int count =n/2;
        for(int i=3;i*i<n;i+=2){
            if(f[i]){ //例如i=9时,9在3*3的时候就判断过9不是素数,就已经
                //将f[9]=true,而之所以可以跳过9是因为,9*9=3*3*9,
                //9*11=3*3*11,就说明,含有9这个因子且不是素数的数,在
                //去除以3作为因子所有不是素数的数的时候已经算过了
                continue;
            }
            for(int j=i*i;j<n;j+=2*i){
                if(!f[j]){
                    count--;
                    f[j]=true;
                }
            }
        }
        return count;
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值