Leetcode-04:计数质数

计数质数

做了四个题了,碰到的第一个自己没想出来的题,记录一下。惨不忍睹,哈哈,不过现在想想还挺简单的,老夫的聪明才智怎么回事,可能太累了,对

官方答案用了一个叫埃氏筛
不想复制粘贴了,我就自己说一下吧,方便以后自己看。
题目是这样的:
给你一个数n,让你统计所有小于它的质数,然后告诉别人一共有几个质数,最后比一比谁说的最快。
1.最最最一般的方法就是一个一个找呗,具体就是,一个for循坏,从i(i大于等于2且小于n)开始,用比i还小的数j(它是大于等于2且小于i),然后看看i是否能整除j,如果有一个j让i整除了,那不好意思,i就不是一个质数,然后就一个一个试呗。
2.第二个就是不试到n了,也就是试到根号n,
3.这个就是埃氏筛了:
一个让你秒懂的图
在这里插入图片描述
从2到10内,先把2的倍数全部干掉,再把3的倍数全部干掉,4已经被2干掉了,同理再5, 再7,就没了,剩下的就是质数,然后还可以简化一下,比如干掉5的倍数时,就没必要从2*5开始了,因为被2干掉了,所以可以直接从5的平方开始了。Very Nice!

class Solution {
    public int countPrimes(int n) {
        int[] isPrime = new int[n];
        Arrays.fill(isPrime, 1);
        int ans = 0;
        for (int i = 2; i < n; ++i) {
            if (isPrime[i] == 1) {
                ans += 1;
                if ((long) i * i < n) {
                    for (int j = i * i; j < n; j += i) {
                        isPrime[j] = 0;
                    }
                }
            }
        }
        return ans;
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值