一个非常基本的Python程序的运行时崩溃

时间:2010-09-02 17:09:06

标签: python crash

我在安装了Python 2.6的Windows XP PC上工作,我试图解决Project Euler问题,但每当我执行代码时,解释器就会挂起。我通过PyScripter,IDLE和MonkeyStudio对它进行了调试,但它仍然不能用于像15这样的琐碎值。

我根本不明白为什么。你能帮帮我吗?

以下是代码:

"""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

4 个答案:

答案 0 :(得分:4)

你有一个无限循环:

x -= 1永远不会被调用,因为它在num%x == 0条件下,从未发生过(因为x永远不会更改其值)。

num为15时,x从7开始。然后,num % x为1,因此条件为false且x未递减 - 因此无限循环

答案 1 :(得分:4)

你的x - = 1语句缩进了一个级别。

仅在num%x为0时递减x

应该是这样的:

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

答案 2 :(得分:1)

除了别人指出的,你的ifprime是错误的。您正在检查while y > 0,当然还要检查y = 1,因此将始终返回false。

出于优化目的,您不必测试x/2,最多可以测试sqrt(x),这已经足够了。

import math

def ifprime (x): 

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

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

    return True

答案 3 :(得分:0)

我有dealt so much with primes我做了补充以找到因素并使用它来定义ifprime,以进行更改。

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)]

(如果您需要许多素数,请使用sieve algorithm代替主要测试。)