繁体   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