我试图从1到100过滤掉素数,这是代码。然而,事实证明输出中遗漏了许多数字。
def isnot_prime(x):
if x == 1:
return True
if x == 2:
return False
for i in range(2, int(x**0.5)+1):
if x % i == 0:
return True
else:
return False
print filter(isnot_prime, range(1,101))
输出为[1,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44] ,46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94 ,96,98,100]。
算法一定有问题。我怎样才能改进它?
谢谢。
答案 0 :(得分:3)
将for
修改为:
for i in range(2, int(round(x**0.5 + 1))+1):
if x % i == 0:
return True
删除else:
并记住int(float)只取整数部分(它不会圆)。
另外,请记住,有更快的算法可以做到这一点。例如,Sieve of Eratosthenes是一种快速而简单的算法。
答案 1 :(得分:0)
我会这样做:
print filter(lambda x: len(['' for y in range(2,x) if x%y==0])==0,range(1,101) )