![](/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.