2015-01-14 20 views
-2

我試圖過濾從1到100的素數,這裏是代碼。然而,事實證明,輸出中有許多數字未被使用。素數的Python算法

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

缺少什麼?你能指望什麼?例如:15或21?順便說一句,用你需要的所有素數做一個查找表,並檢查它。它更簡單,更快速,大量的實現都在互聯網上。 – luk32

回答

3

修改您for這樣:

for i in range(2, int(round(x**0.5 + 1))+1): 
    if x % i == 0: 
     return True 

取出else:並記住,INT(浮動)只是需要不可分割的一部分(而不是四捨五入)。

另外,請記住,有更快的算法來做到這一點。例如Sieve of Eratosthenes是一個快速而簡單的算法。

+0

非常感謝! – Devai

+0

非常感謝!如果我保留關鍵字'round',它將打印數字'3'。最後,我修改了代碼這樣: DEF isnot_prime(X): 如果x == 1: 返回True 如果x == 2: 在範圍對於i返回False (2,INT(X ** 0.5 + 1)+1): if x%i == 0: return True return False print filter(isnot_prime,range(1,101)) – Devai

0

我會做這種方式:

print filter(lambda x: len(['' for y in range(2,x) if x%y==0])==0,range(1,101))