码迷,mamicode.com
首页 > 其他好文 > 详细

Leetcode 204. Count Primes

时间:2016-06-19 06:46:44      阅读:195      评论:0      收藏:0      [点我收藏+]

标签:

题目概述:

Description:

Count the number of prime numbers less than a non-negative number, n.

Credits:
Special thanks to @mithmatt for adding this problem and creating all test cases.

解题思路:

本题的思路分为以下几步:

  • 首先建立一个长度为 n 的数组Prime,用来从0到n-1是否为素数。
  • 将Prime[0]和Prime[1]设为False,因为0和1都不是素数。
  • 接下来为关键步骤,即将小于n的整数中不是素数的设为False。
    • 如果一个正整数可以表示为两个数(除1以外)的乘积,则该数不是素数,所以我们需要找两个数,如果这两个数的乘积小于n,则相乘得到的结果不是素数。
    • 首先确定第一个乘数 i,我们需要取 i 为素数,因为非素数肯定可以由素数表达,计算非素数的乘积就造成了没有必要的额外计算量。i 的取值只需考虑 2 到 sqrt(n)+1 之间,因为当 i>sqrt(n)时,i乘比自身大的数时,其结果必然大于n,而如果 i 乘以比自己小的数时,属于多余的计算,因为这部分计算内容已经由 i 在之前取值中计算过了。
    • 接下来是第二个乘数 j, j 是倍数,目的是将 n 范围内的整数中素数 i 的倍数全部剔除掉。
  • 最后一步为统计Prime中剩下的True的个数,即为素数的个数

代码:

class Solution(object):
    def countPrimes(self, n):
        """
        :type n: int
        :rtype: int
        """
        if n <=2:
            return 0
        Prime = [True]*n
        Prime[0],Prime[1] = False,False
        for i in range(2,int(n**0.5)+1):
            if Prime[i]:
                Prime[i*i:n:i] = [False]*len(Prime[i*i:n:i])
        return sum(Prime)

 

Leetcode 204. Count Primes

标签:

原文地址:http://www.cnblogs.com/winnie-daddy/p/5597350.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!