[英]My function to filter out prime numbers is printing duplicates, how can I fix this?
這是我所擁有的。 該函數在過濾合數方面工作得非常好,但我不明白為什么它會打印某些數字的重復項:
def prime_filter(list):
prime_list = []
for i in list:
if i == 2:
prime_list.append(i)
if i > 1:
for n in range(2, i):
if(i % n == 0):
break
else:
prime_list.append(i)
print("The total number of prime numbers is: ", len(prime_list))
print(prime_list)
這是我對該函數及其返回的輸出的測試:
# test
test_list = [2, 3, 6, 8, 11]
prime_filter(test_list)
The total number of prime numbers is: 11
[2, 3, 11, 11, 11, 11, 11, 11, 11, 11, 11]
有誰知道我該如何解決這個問題? 任何幫助是極大的贊賞。
您應該檢查 prime_list 是否除以所有數字。
def prime_filter(list):
prime_list = []
for i in list:
if i == 2:
prime_list.append(i)
if i > 2:
for n in range(2, i):
if(i % n == 0):
break
else:
prime_list.append(i)
print("The total number of prime numbers is: ", len(prime_list))
print(prime_list)
這可能適用於解決方案。 當所有檢查完成后, i
應該被添加到prime_list
。
def prime_filter(list):
prime_list = []
for i in list:
if i == 2:
prime_list.append(i)
if i > 1:
for n in range(2, i):
if(i % n == 0):
break
if n**2>i:
prime_list.append(i)
break
print("The total number of prime numbers is: ", len(prime_list))
print(prime_list)
在你的代碼, i>1
為每個值i
這是奇怪的是越來越追加為odd no%2==1
,這使得在程序去else
部分。
此外,您只需要在使用 for 循環時添加 else 部分沒有值除以i
。
這是改進的工作代碼
def prime_filter(_list):
prime_list = []
for i in _list:
if i == 2:
prime_list.append(i)
elif i==1:
continue
elif i > 2:
for n in range(2, i):
if(i % n == 0):
break
else:
prime_list.append(i)
print("The total number of prime numbers is: ", len(prime_list))
print(prime_list)
test_list = [2, 3, 6, 8, 11]
prime_filter(test_list)
# output [2,3,11]
sahasrara62 和 Abhinav 的答案當然是正確的,但我想指出這里的低效率。 復合n
的最大因素至多是sqrt(n)
,它允許在內循環中保存許多迭代。
另一個優化是避免檢查偶數因子 - 我們已經知道該值是奇數
def prime_filter(lst):
prime_list = [value for value in lst
if (not value % 2
or any(not value % n for n in range(3, value**.5 + 1, 2))
)]
可以通過在檢查因素之前添加快速素性測試來進一步改進
您的代碼將無法正確獲取質數,它將添加所有未除以 2 的數字,例如,如果列表中有 9,它將包含在 prime_list 中。 我想提出以下建議:
def prime_filter(list):
prime_list = []
for i in list:
if i == 2:
prime_list.append(i)
if i > 2:
prime_flag = True
for n in range(2, i):
if i % n == 0:
prime_flag = False
break
if prime_flag:
prime_list.append(i)
print("The total number of prime numbers is: ", len(prime_list))
print(prime_list)
test_list = [2, 3, 6, 8, 9, 11] prime_filter(test_list)
素數的總數為:3
[2, 3, 11]
else:
prime_list.append(i)
對於不划分i
每個因素,它將被附加到列表中,這是不正確的。 只需將功能更改為
def prime_filter(lst):
prime_list = []
for i in lst:
isprime = 1
if i == 2:
prime_list.append(i)
else if i > 1:
for n in range(2, i):
if(i % n == 0):
isprime = 0
break
if isprime:
prime_list.append(i)
print("The total number of prime numbers is: ", len(prime_list))
print(prime_list)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.