簡體   English   中英

我過濾素數的功能是打印重復項,我該如何解決這個問題?

[英]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]

如何檢查 no 是否為素數

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM