簡體   English   中英

從 Python 中的列表中刪除數字的倍數

[英]Removing multiples of a number from a list in Python

我是 Python 的新手,我正在開發一個程序,它可以找到一個數字的質因數。 到目前為止,我的代碼如下所示:

num = int(input('\nEnter a natural number greater than 1: '))
if num <= 1:
    while num <= 1:
        num = int(input('\nI said greater than 1: '))
if num == 2:
    print('\n', num, 'is a prime number.')
else:
    toggle = 0
    flist = []
    for i in range(2, num - 1):
        if num % i == 0:
            flist.append(i)
            toggle = 1
    if toggle == 0:
        print('\n', num, 'is a prime number.')
    if toggle == 1:
        print('\n', num, 'is not a prime number.')
        print('\nIt\'s prime factors are:', flist)

例如,輸入為 30,我得到以下輸出:

Enter a natural number greater than 1: 30

30 is not a prime number.

It's prime factors are: [2, 3, 5, 6, 10, 15]

在這種情況下的主要因素是2 , 3 , 5 我怎樣才能刪除它們的倍數? 謝謝你。

我會定義一個額外的函數來檢查一個數字是否是素數

def is_prime(n):
    if n>1:
        for i in range(2,n):
            if (n % i)==0:
                return False
    return True

然后我會在你的代碼中使用它來檢查一個數字是否是素數,然后再將它添加到最終的素數列表中。

num = int(input('\nEnter a natural number greater than 1: '))
if num <= 1:
    while num <= 1:
        num = int(input('\nI said greater than 1: '))
if num == 2:
    print('\n', num, 'is a prime number.')
else:
    toggle = 0
    flist = []
    for i in range(2, num - 1):
        if num % i == 0:
            if is_prime(i):   # append only prime numbers
                flist.append(i)
            toggle = 1
    if toggle == 0:
        print('\n', num, 'is a prime number.')
    if toggle == 1:
        print('\n', num, 'is not a prime number.')
        print('\nIt\'s prime factors are:', flist)

這為您提供了正確的輸出:

Enter a natural number greater than 1: 30

 30 is not a prime number.

It's prime factors are: [2, 3, 5]

這是一個使用 Eratosthenes 篩法的解決方案,首先找到 N 下的所有質數,然后通過這些找到所有質數因子,這應該非常有效

import numpy as np

def findSieve(num):
    allN = np.arange(1,num+1,1)
    mask = allN == allN
    maskN = np.ma.MaskedArray(allN)
    p = 2

    while maskN[p:].count() > 0:
        mask = mask & ((allN%p != 0) | (allN <= p))
        maskN = np.ma.MaskedArray(maskN, mask =~ mask)
        p = maskN[p:].min()

    return np.asarray(maskN[maskN.mask == False])

def findPrimeFactors(num):        
    sieve = findSieve(num)
    flist = []
    num_factored = num
    for i in range(1,len(sieve)) :
        while num_factored % sieve[i] == 0:
            flist.append(sieve[i])
            num_factored = num_factored // sieve[i]
            if num_factored == 1:
                break

    prime = len(flist) == 1
    if prime:
        print('\n', num, 'is a prime number.')
    else:
        print('\n', num, 'is not a prime number.')
        print('\nIt\'s prime factors are:', flist)


num = int(input('\nEnter a natural number greater than 1: '))
findPrimeFactors(num)

您將得到質因數的倍數,例如 6 = 2 × 3、10 = 2 × 5 和 15 = 3 × 5。

為了避免這些,您應該在找到它們時將初始數字除以質因數,這樣它就不會再次除以這些質數的倍數。

此外,您應該重復這樣做,因為數字通常有一個質因子的指數(例如,12 = 2² × 3,所以您應該除以 2 兩次。)

for i in range(2, num):
    while num % i == 0:
        flist.append(i)
        num = num // i
    if num == 1:
        break

當您達到 1 時,您就知道可以停止了。

您還可以進行其他優化,例如當 i² 大於 num 時,您知道 num 必須是素數,因為您已經將其除以所有小於 i 的因子。

您也可以跳過 2 之后的偶數,因為這些永遠不會是因數。

使用上面的簡單代碼,您會知道每當 flist 為空時, num 就是素數。 (您不需要額外的切換來跟蹤它。)這是有效的,因為您永遠不會除以 num 本身,所以如果您到最后並且沒有除過一次,這意味着它是一個質數。

對於諸如 12 之類的數字,您的 flist 將具有[2, 2, 3] 如果你想要唯一的質因數,沒有重復,你可以使用set(flist)擺脫重復。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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