【发布时间】: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