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

分数を計算する目的でこれらの関数を使用するプログラムを作成しています。ただし、シェルで 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

あなたは混乱しicheckあなたのgetPrimeList()機能で。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]すべての i)はインデックスエラーで失敗します。

primelistが空になる別の方法は、 isPrime()never が 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 に答える