![](/img/trans.png)
[英]Using a different approach to find prime number, by removing all the multiples of prime number from a list
[英]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.