【发布时间】:2016-01-23 17:57:48
【问题描述】:
我正在解决来自leetcode 的编码问题,我们应该计算小于非负数 n 的素数的数量。
这是我的解决方案:
class Solution(object):
def isPrime(self, Number):
return 2 in [Number, 2**Number % Number]
def countPrimes(self, n):
"""
:type n: int
:rtype: int
"""
count_prime = 0
prime_range = filter(lambda x: x % 2 != 0 and x % 3 != 0 and x % 5 != 0, xrange(n))
for i in prime_range:
if self.isPrime(i):
count_prime += 1
return count_prime
print Solution().countPrimes(499979)
虽然这适用于较小的数字,但较大的数字会花费大量时间,而且我不确定哪个部分在我的程序中消耗更多时间?这里我只测试大于 100 的数字。
谁能帮我找出哪个部分需要更多时间
【问题讨论】:
-
顺便说一句,341 是最小的费马伪素数。它是复合的最小正数,但您的
isPrime函数返回True。 -
您可能想查看 Python 的 pow function 的 3 参数形式。并阅读伪素数、强伪素数、卡迈克尔数和埃拉托色尼筛法。
-
1387, 1729, 2047, 2701, 2821, 3277, 4033, 4369, 4681, 5461, 6601, 7957, 8321, 8911 是您的 isPrime 的更多误报
-
请注意,在 Eratosthenes 的筛子实现中,您根本不需要
isPrime:将if self.isPrime(i):替换为if total_prime[i]:(并删除total_prime[i] = True行:这是多余的)。跨度> -
请不要在帖子中添加您的答案。考虑创建一个新答案并解释您在该答案中执行的步骤。在这种情况下,我已经回滚了编辑。下次小心点。问候
标签: python math time-complexity primes