Leetcode204.Count Primes

继续新的一天,懒人几天才做一道题,哎,没办法,太懒了加上还有其他的事。

这道题特么的又超时了------TLE-----

题目描述:Count the number of prime numbers less than a non-negative number, n.

---------------------------------------------------------------------------------------------------------------------------------

python

先贴出自己第一次实现的代码


def countprime(n):
    count = 0
    for j in range(2, n):
        # is_prime = Isprime(j)
        is_prime = True
        for i in range(2, j):
            item = j / float(i)
            if item == int(item):
                is_prime = False
        if is_prime:
            count += 1
        else:
            continue
    return count 

因为一直超时,百度找了个厄拉多塞筛法。

他的思想简单来说,就是划去法,先划去2-N这些数放入表中,然后在2的上面画一个圆圈,然后划去2的其他倍数;第一个既未画圈又没有被划去的数是3,将它画圈,再划去3的其他倍数;现在既未画圈又没有被划去的第一个数 是5,将它画圈,并划去5的其他倍数……依次类推,一直到所有小于或等于N的各数都画了圈或划去为止。这时,表中画了圈的以及未划去的那些数正好就是小于 N的素数。

class Solution(object):
    def countPrimes(self, n):
        """
        :type n: int
        :rtype: int
        -- 厄拉多塞筛法 --
        """
        is_del = [True, True, False]  # 标记是否划去,0,1是false,2是true
        for i in range(3, n):
            if i % 2 == 0:
                is_del.insert(i, True)  # 划去2的倍数
            else:
                is_del.insert(i, False)
        for i in range(3, n):
            if is_del[i] == False:  # 第一次未被划去
                if i*i <= n:  # 素数的平方小于等于N
                    j = 2
                    while j*i < n:
                        is_del[j*i] = True
                        j += 1
        count = 0
        for i in range(2, n):
            if is_del[i] == False:
                count += 1
        return count 

思想很巧妙,反过来推。
















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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值