Sublime Text上的“is_prime”python函数问题

时间:2014-09-01 15:36:45

标签: python primes sublimetext3

我正在尝试运行以下简单代码:

import math
def is_prime(N):
    for i in range(2, int(math.sqrt(N))):
        if (N % i == 0) :
            print(str(N) + " is not prime")
            return False 
    print(str(N) + " is prime")
    return True

目标是确定数字是否为素数(非常简单)。但是,我无法使用此代码。我已经设法查明int(math.sqrt(N))指令周围的问题,但我不明白为什么它不起作用,因为运行int(math.sqrt(134))例如适用于我。我在这段代码中看不到有什么问题吗?

我也开始质疑编译器的可行性。我使用Sublime Text 3和默认的Python Builder。也许我正在做的事情在Sublime Text上特别错误?

编辑:忘了提问题。例如,当我运行is_prime(8)时,它会返回8 is prime。但它根本不显示任何错误。但是,应该注意的是,按预期运行is_prime(134)会打印134 is not prime。如果有人想要,我可以尝试for循环。

2 个答案:

答案 0 :(得分:1)

试试这个:

import math
def is_prime(n):
    for i in range(2, int(math.sqrt(n))+1):
        if n%i == 0 :
            return False 
    return True

range()在实际到达第二个数字之前停止。在这种情况下,您也想测试该数字,因此您想要向下舍入,然后添加一个。


更高效的版本(x10 - x1000速度提升):

def memoise(func):
    memory = {}
    def wrapper(n):
        if n in memory:
            return memory[n]
        ret = func(n)
        memory[n] = ret
        return ret
    return wrapper

@memoise
def is_prime(n):
    if n <= 3:
        return n > 1
    if not n%2 or not n%3:
        return False

    for i in range(5, int(n**0.5)+1, 6):
        if not n%i or not n%(i+2):
            return False
    return True

在翻译中玩:

>>> math.sqrt(8)
2.8284271247461903
>>> int(math.sqrt(8)) + 1
3
>>> for i in range(2, 2):
        print(i)

>>> for i in range(2, 3):
        print(i)

2

答案 1 :(得分:1)

我重写了程序中的一些行,使其更有效率。 你的for循环迭代所有数字直到N的根。如果你从检查数字%2 == 0开始,你可以排除所有偶数,只检查奇数3,5,7,...

import math
def is_prime(N):
    if(N == 2):
        print(str(N) + " is a prime")
        return True
    if((N % 2 == 0)or(N == 1)):
        print(str(N) + " is not prime")
        return False
    for i in range(3,int(math.sqrt(N))+1,2):
        if(N % i == 0):
            print(str(N) + " is not prime")
            return False
    print(str(N) + " is prime")
    return True