2010-09-02 4 views
1

Je travaille sur un PC Windows XP avec une installation Python 2.6 et j'essayais de résoudre un problème Project Euler, mais chaque fois que j'exécute le code, l'interpréteur se bloque. Je l'ai débogué à travers PyScripter, IDLE et MonkeyStudio, mais il ne fonctionne toujours pas, même pour des valeurs triviales comme 15.Crash d'exécution pour un programme Python très basique

Je ne comprends tout simplement pas pourquoi. Pouvez vous me donner un coup de main?

Voici le code:

"""Project Euler Problem 3 
Author: A""" 

num = 15 
prime = [1] 
x = long (round(num/2)) 

def ifprime (x): 
     """ Defining the function that checks if the number is prime or not"""  
     """ Checking if the passed number is prime or not""" 

     y = long(round(x/2)) 
     while y > 0: 
       if x%y == 0: 
         return False 
       y -= 1 
     return True 

while x > 0: 
    if num%x == 0: 
     if ifprime(x): 
       print "I've found a prime! " 
       print x 
       prime[len(prime):] = [x] 
     x -= 1 
+1

est-ce pas une boucle infinie? – quantumSoup

+0

Vous dites que vous avez essayé de le déboguer ... Vous ne trouvez pas où ça ne va pas? (J'ai fait, et c'est assez évident ce qui se passe) – Kena

+0

Je n'ai aucune idée pourquoi je ne l'ai pas vu. Je viens de commencer à coder il y a quelques jours. Donc, cela pourrait avoir quelque chose à voir avec ça. –

Répondre

4

Votre instruction x - = 1 est indentée d'un niveau trop loin.

x ne seront décrémentés lorsque num% x est 0

Il devrait être le suivant:

while x > 0: 
    if num%x == 0: 
     if ifprime(x): 
       print "I've found a prime! " 
       print x 
       prime[len(prime):] = [x] 
    x -= 1 
4

Vous avez une boucle infinie:

x -= 1 est jamais appelé car il est sous la condition num%x == 0, ce qui ne se produit jamais (comme x ne change jamais sa valeur).

Lorsque num est 15, x commence comme 7. Ensuite, num % x est 1, donc la condition est fausse et x n'est pas décrémenté - boucle ainsi ad infinitum.

1

Outre ce que d'autres ont souligné, votre ifprime est faux. Vous vérifiez while y > 0, et bien sûr que les tests jusqu'à y = 1, et donc retournera toujours faux. Et à des fins d'optimisation, vous n'avez pas besoin de tester jusqu'à x/2, vous pouvez tester jusqu'à sqrt(x) et c'est assez bon.

import math 

def ifprime (x): 

    y = math.ceil(math.sqrt(x)) 

    while y > 1: 
     if x % y == 0: 
      return False 
     y -= 1 

    return True 
+0

Oui, j'ai remarqué que sur la course et je l'ai corrigé. D'autre part, la fonction ne reconnaît pas 2 comme un premier si je le prends comme y> 1. Donc, je dois comprendre cela. Merci beaucoup pour l'astuce de l'optimisation. –

+0

@JustA: Hardcode 2 à être premier, et seulement vérifier la divisibilité par 2 et par les nombres impairs> = 3. – Brian

+0

@Brian: Je me sens comme un retard en ce moment. J'ai beaucoup à apprendre. –

0

Je dealt so much with primes que je l'ai fait le complément de trouver et de définir le facteur ifprime à l'aide que, pour un changement.

import math 

## I want any which return first not False value 
def some(seq): 
    for item in seq: 
     if item: 
      return item 

def factor (number): 
    """ returns smallest factor of number or None """ 
    if number < 4: return None 
    return some(divisor 
       for divisor in [2] + range(3,int(number ** 0.5)+2, 2) 
       if not(number % divisor)) 

# little slower way for fun (because factor gives the factoring it found) 
def ifprime(number): 
    return number > 1 and not factor(number) 

print [number for number in range(100) if ifprime(number)] 

(Si vous avez besoin de beaucoup de nombres premiers utilisent sieve algorithm au lieu de test d'amorçage.)

Questions connexes