0
def getPrimeList(check):
    storedprimes = []
    i = 2
    while i <= check:
        if isPrime(check):
            storedprimes = storedprimes + [i]
        i = i + 1
    return storedprimes
def getPrimeFact(check):
    primelist = getPrimeList(check)
    prime_fact = []
    i = 0
    while check !=1:
        if check%primelist[i]==0:
            prime_fact=prime_fact+[primelist[i]]
            check = check/primelist[i]
        i = i + 1
        if i == len(primelist):
            i = 0
    return prime_fact
def getGCF(checks):
    a=0
    listofprimefacts=[]
    while a<len(checks):
        listofprimefacts=listofprimefacts+[getPrimeFact(checks[a])]
        a=a+1
    b=0
    storedprimes=[]
    while b<len(primefactlist):
        c=0
        while c<len(listofprimefacts[b]):
            if listofprimefacts[b][c] not in storedprimes:
                storedprimes=storedprimes+[listofprimefacts[b][c]]
            c=c+1
        b=b+1
    prime_exp=[]
    d=0
    while d<len(storedprimes):
        prime_exp=prime_exp+[0]
        d=d+1

    e=0
    while e<len(storedprimes):
        f=0
        while f<len(listofprimefacts):
            if f==0:
                prime_exp[e]=listofprimefacts[f].count(storedprimes[e])
            elif prime_exp[e]-(listofprimefacts[f].count(storedprimes[e]))>0:
                prime_exp[e]=listofprimefacts[f].count(storedprimes[e])                
            f=f+1
        e=e+1
    g=0
    GCF=1
    while g<len(primelist):
        GCF=GCF*(storedprime[g]**prime_exp[g])
        g=g+1
    return GCF

我正在创建一个程序,该程序将使用这些函数来计算分数;但是,在 shell 中测试我的 GCF 函数后,我不断收到列表索引错误。我不知道,考虑到我 99% 确定我的索引没有问题,错误来自哪里,通常我不会在 SO 中发布这样一个“可修复”的问题,但这次我只是不知道问题是什么,再次感谢。

哦,这是确切的错误

File "<pyshell#1>", line 1, in <module>
    getGCF(checks)
  File "E:\CompProgramming\MidtermFuncts.py", line 31, in getGCF
    listofprimefacts=listofprimefacts+[getPrimeFact(checks[a])]
  File "E:\CompProgramming\MidtermFuncts.py", line 20, in getPrimeFact
    if check%primelist[i]==0:
IndexError: list index out of range
4

2 回答 2

1

您可能想重新考虑如何解决这个问题。在当前形式下,您的代码真的很难使用。

这是我的做法:

def is_prime(n):
    for i in range(2, int(n ** 0.5) + 1):
        if n % i == 0:
            return False

    return True

def prime_factors(number):
    factors = []

    for i in range(2, number / 2):
        if number % i == 0 and is_prime(i):
            factors.append(i)

    return factors

def gcf(numbers):
    common_factors = prime_factors(numbers[0])

    for number in numbers[1:]:
        new_factors = prime_factors(number)
        common_factors = [factor for factor in common_factors if factor in new_factors]

    return max(common_factors)

这一行就在这里:

common_factors = [factor for factor in common_factors if factor in new_factors]

是一个列表理解。您可以将其展开到另一个for循环中:

temp = []

for factor in common_factors:
    if factor in new_factors:
        temp.append(factor)

common_factors = list(temp)  # Pass by value, not by reference
于 2013-02-01T01:00:29.500 回答
0

你混淆了你的i功能;你测试是否是素数,不是;这是正确的功能:checkgetPrimeList()check i

def getPrimeList(check):
    storedprimes = []
    i = 2
    while i <= check:
        if isPrime(i):  # *not* `check`! 
            storedprimes = storedprimes + [i]
        i = i + 1
    return storedprimes

primelist将被设置为一个空列表(getPrimeList(check)返回一个空列表),并且您的primelist[i](for any i ) 将因索引错误而失败。

另一种为primelist空的方式是当isPrime()从不返回 True 时;您没有向我们展示该功能来验证它。

您的下一个错误在getGCF(); 您首先定义一个listofprimefacts变量(一个列表),但后来引用一个不存在的primefactlist变量,导致NameError. 下一个名称错误将primelist在该函数中进一步出现。

你真的很想重新阅读Python 教程;您在代码中遗漏了许多 python 习语;特别是关于如何在序列上创建循环(提示:for check in checks:while带有索引变量的循环更容易使用)以及如何将项目附加到列表中。

我的个人工具包定义了这一点:

from math import sqrt

def prime_factors(num, start=2):
    """Return all prime factors (ordered) of num in a list"""
    candidates = xrange(start, int(sqrt(num)) + 1)
    factor = next((x for x in candidates if (num % x == 0)), None)
    return ([factor] + prime_factors(num / factor, factor) if factor else [num])

不需要isPrime()测试。

于 2013-02-01T01:05:41.733 回答