【问题标题】:Prime factorization code produces IndexError with certain numbers素数分解代码产生具有特定数字的 IndexError
【发布时间】:2017-03-11 03:40:26
【问题描述】:

问题

当输入32,并选择其他数字时,报错如下:

Traceback (most recent call last):
  File "python", line 43, in <module>
IndexError: list assignment index out of range

(第 43 行是 extrafactors[i] = factorCheck(i)。)但是,对于其他数字,代码可以正常工作。

代码

from functools import reduce

n = int(input("Please input a whole number"))
primes = []

def isPrime(x):
    if x<2:
        return False
    for i in range(2,x):
        if not x%i:
           return False
    return True 

def factorCheck(n):
    x = []
    for i in range(1,n):
        if n%i==0:
            x.append(i)
        return x

if isPrime(n) == True:
    print("1, ",n)
else:
    for i in range (1,n):
        if isPrime(i) == True:
            if n%i == 0:
                primes.append(i)
    multiplied = reduce(lambda x, y: x*y, primes)
    if multiplied != n:
        left = int(n/multiplied)
        if isPrime(left) == True:
            primes.append(left)
        else:
            extrafactors = []
            extrafactors = factorCheck(left)
            while len(extrafactors) > 0:
                for i in extrafactors:
                    if isPrime(i) == True:
                        primes.append(i)
                        extrafactors.remove(i)
                    else:
                        extrafactors[i] = factorCheck(i)
                        extrafactors = [item for sublist in extrafactors for item in sublist]
    primes = sorted(primes)
    print(primes)

代码说明

定义了两个函数。一个检查一个数字是否为素数,另一个生成一个数字的因子列表。首先,程序接收用户输入的数字。然后,它测试它是否是素数,然后打印素数分解(1,无论数字是多少)。如果不是,它基本上会找到所有作为数的因数并且也是素数的素数。然后程序将它们相乘,如果它们小于输入的原始数字,它会找到差异的(素)因子并将它们附加到最后打印的素数列表中。

我了解该程序可能效率低下,但我了解它是如何编写的。给出错误的行将一个数字替换为该数字的因子列表。

【问题讨论】:

  • 调用factorCheck(1)时会出现问题,因为range(1,1)是空的,所以它永远不会返回(因此默认为None
  • 循环for i in extrafactors也有问题。循环中的某些代码表现得好像i 应该是一个列表element,而其他部分代码表现得好像i 应该是一个列表index .
  • 您对factorCheck 的缩进似乎不正确,您将在第一次迭代中返回。您还在迭代 for i in extrafactors 并同时从中删除,这很糟糕。添加print 语句以检查发生了什么。
  • 您如何处理一个因素多次出现的情况,例如 50=5*5*2?
  • 注意if isPrime(n) == True:可以简化为if isPrime(n):

标签: python python-3.x math prime-factoring


【解决方案1】:

我不会审查您的代码。它比它需要的复杂得多。

这是一个用于分解整数的简单函数。这不是分解整数的最佳方法,但只要 n 不太大,例如小于十位数,它就很简单且相当有效。

def factors(n):
    f, fs = 2, []
    while f * f <= n:
        if n % f == 0:
            fs.append(f)
            n = n / f
        else:
            f = f + 1
    fs.append(n)
    return fs

【讨论】:

    【解决方案2】:

    这个问题用递归函数更容易解决。递归函数调用自己。所以,基本上一旦我们找到一个因子,我们检查这个数字是否可以进一步分解,如果可以,我们将它附加到列表并继续分解,如果它不能被分解,那么我们只需附加并返回。

    def factor(numberToFactor, arr=list()):
        for i in range(2, numberToFactor // 2 + 1):
            if numberToFactor % i == 0:
                return factor(numberToFactor/i,arr + [i])
        return list(set(arr + [numberToFactor]))
    
    print(factor(32))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-27
      • 1970-01-01
      • 2013-08-09
      • 2017-02-15
      • 1970-01-01
      • 2011-05-21
      相关资源
      最近更新 更多