【发布时间】:2021-11-12 06:54:00
【问题描述】:
π(x) = 素数个数≤x
下面的代码给出了小于或等于 N 的素数个数
它适用于 N
-
输入 - 输出表
| Input | Output | |-------------|---------------| | 10 | 4✔ | | 100 | 25✔ | | 1000 | 168✔ | | 10000 | 1229✔ | | 100000 | 9592✔ | | 1000000 | 78521✘ |然而,π(1000000) = 78498
import time def pi(x): nums = set(range(3,x+1,2)) nums.add(2) #print(nums) prm_lst = set([]) while nums: p = nums.pop() prm_lst.add(p) nums.difference_update(set(range(p, x+1, p))) #print(prm_lst) return prm_lst if __name__ == "__main__": N = int(input()) start = time.time() print(len(pi(N))) end= time.time() print(end-start)
【问题讨论】:
-
你在哪里检查素数?怎么查?
-
@AlexPetrosyan
nums.difference_update(set(range(p, x+1, p))从set(nums)中删除p 的所有倍数,其中nums是一组奇数。 -
好的。尝试添加一些调试
prints 以查看大于 100 000 的倍数会发生什么。我怀疑在某些时候某些操作会静默失败。 -
也许您认为
num.pop()会从集合中移除 smallest 元素,但我不认为这是有保证的。pop()的文档说:从集合中删除并返回任意元素。 -
@PresidentJamesK.Polk 谢谢!
nums.difference_update(p, x+2*p, p)现在给出正确答案正确答案。
标签: python python-3.x list math primes