质因数分解代码产生具有特定数字的 IndexError
Prime factorization code produces IndexError with certain numbers
问题
输入32,和select其他数字时,报如下错误:
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,无论数字是多少)。如果不是,它基本上会找到所有作为数因数并且也是素数的素数。然后程序将它们相乘,如果它们小于输入的原始数,它会找到差异的(素数)因子并将它们附加到最后打印的素数列表中。
我知道程序可能效率低下,但我理解它是如何编写的。给出错误的行用该数字的因子列表替换了一个数字。
这个问题用递归函数更容易解决。递归函数调用自己。所以,基本上一旦我们找到一个因子,我们就会检查这个数字是否可以进一步分解,如果可以,我们将它追加到列表中并继续分解,如果不能分解,那么我们简单地追加和 return.
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))
我不会审查您的代码。它比需要的复杂得多。
这是一个简单的整数因式分解函数。这不是因式分解整数的最佳方法,但只要 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
问题
输入32,和select其他数字时,报如下错误:
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,无论数字是多少)。如果不是,它基本上会找到所有作为数因数并且也是素数的素数。然后程序将它们相乘,如果它们小于输入的原始数,它会找到差异的(素数)因子并将它们附加到最后打印的素数列表中。
我知道程序可能效率低下,但我理解它是如何编写的。给出错误的行用该数字的因子列表替换了一个数字。
这个问题用递归函数更容易解决。递归函数调用自己。所以,基本上一旦我们找到一个因子,我们就会检查这个数字是否可以进一步分解,如果可以,我们将它追加到列表中并继续分解,如果不能分解,那么我们简单地追加和 return.
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))
我不会审查您的代码。它比需要的复杂得多。
这是一个简单的整数因式分解函数。这不是因式分解整数的最佳方法,但只要 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