质数筛选-筛选1-n的质数

质数:大于1的正整数,除了能被1或者其本身整除之外不能被其他数整除也叫素数,注意1不是正数

合数:大于1的正整数,可以被除了1和其本身整除

关于质数的几个常用性质:

1、假如x是质数,那么2x,3x,……都是合数

2、任何一个合数都可以分解为几个质数的积,且这种分解是唯一的

如何判断质数:

如果一个数不是质数那么一定满足x*y = num,其中x>1,y<num,x<y;因此1<x<=\sqrt{num},所以遍历(1,\sqrt{num}]的所有的数,如果都能被num整除说明num是质数,反之不是

相关算法:

厄拉多塞筛法(埃氏筛):如果x是质数那么2x,3x,……都是质数,具体做法遇到x是质数的时候就将2x,3x,4x......都标记为合数

优化:我们可以从x*x开始标记,因为2x,3x....(x-1)*x都被前面的数标记了(例如k*x,2<=k<x,k一定可以分为几个质数的乘积,因此k*x = p1*p2……*pk*x)

实现代码:

public int countPrimes(int n) {
        boolean[] visite = new boolean[n];  //标记质数
        Arrays.fill(visite, true);
        int ans = 0;                   //质数的数量
        for (int i = 2; i < n; i++) { //从2开始
            if (visite[i]) {
                ans++;
                if ((long) i * i < n) {   //防止数字大小越界
                    for (int m = i * i; m < n; m += i) {
                        visite[m] = false;
                    }
                }
            }
        }
        return ans;

    }

相关题型:leetcode 204. 计数质数

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值