2013-02-01 4 views
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 %를 고려에서 오는, 일반적으로 그런 "fixable"문제를 게시하지 않았지만 이번엔 난 그냥 문제가 뭔지 모르겠지만, 다시 한 번 감사드립니다.파이썬리스트 색인 오류

아, 그리고 heres는 정확한 오류 당신은이 문제를 공격하는 방법을 다시 생각 할 수 있습니다

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 
+0

'for'루프를 읽습니다. – Blender

+0

블렌더 당신의 이름과 풍자적 인 그러나 심각한 스타일의 스타일은 당신을 전에 만난 ive처럼 느낍니다. 다시 한 번 이방인 : D – Alvaro

+0

학습 활동입니까, 아니면 문제를 해결하려고합니까? 나는 당신의 분수 요구를 해결해야만하는 기존의 Python 솔루션이 있다는 것을 확신하지만, 계속 배우고 있다면. – steveha

답변

0

; check이 소수 인 경우 이 아닌 경우i; 여기에 올바른 기능입니다 : (getPrimeList(check) 빈 목록을 반환으로)

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

이를 primelist가 빈리스트로 설정되고이 primelist[i] (에 대한 모든i) 인덱스 오류와 함께 실패합니다.

primelist이 비어있는 또 다른 방법은 isPrime()이 True를 반환하지 않을 때입니다. 당신은 그 기능을 우리에게 보여주지 않습니다.

다음 오류는 getGCF()입니다. 먼저 listofprimefacts 변수 (목록)를 정의하지만 나중에 NameError으로 이어지는 변수가없는 primefactlist 변수를 참조하십시오. 다음 이름 오류는 해당 기능에서 더 이상 primelist이 될 것입니다.

정말로 Python tutorial을 다시 읽으려고합니다. 당신은 코드에서 많은 파이썬 관용구를 놓치고 있습니다. 특히 시퀀스를 통해 루프를 만드는 방법 (힌트 : 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() 테스트를 필요로하지 않는 :

내 개인 툴킷이 정의합니다.

+0

문제는 다른 langauges를 배우는 관문으로 파이썬을 사용하고 있습니다. 그 이유는 파이썬 컨텍스트가 '내'코드에 없기 때문입니다.하지만 나는 그것이 무엇인지 알고 있습니다. 내가 테스트 목적으로도 사용하지 말아라. 쉘을 열어 라. ex : checks = 125,525,325 그런 다음 간단히 getGCF (체크)를 호출한다. – Alvaro

+2

@Alvaro 의도적으로 언어 기능을 무시한다면, 기대해야합니다. 'for' 관용어는 어떤 종류의 반복자를 통해서 또는'foreach' 또는'for each' 또는 다른 어떤 syntantical construct의 철자를 통해 많은 언어로 존재합니다 - 당신이이 접근법으로 당신 자신을 "배움") –

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 루프를 풀다 수 있습니다 : 당신은 당신의 getPrimeList() 기능에 icheck을 혼합

temp = [] 

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

common_factors = list(temp) # Pass by value, not by reference