当我想要输入5的“真”时,打印“无”

时间:2017-04-14 03:37:31

标签: python

在这个素性测试程序中,当我输入素数而不是“真”时,会打印“无”。如何让它打印'真'?

    def main():
        import math
        def check_n(n):
            n_s = int(math.sqrt(n))
            for i in range(2, n_s):
                if (n_s % i) == 0:
                    return False
                    break
                else:
                    return True
        def msg():
            n = int(input('Enter a number, I will return True if it is a prime'))
            return n

        print(check_n(msg()))

    main()

4 个答案:

答案 0 :(得分:2)

您需要将int(math.sqrt(n))更改为int(math.sqrt(n)+1),因为range会一直运行到n_s-1。因此,如果输入为5,range(2,int(math.sqrt(5)))只是range(2,2),则为空。

此外,您需要在return True循环之外取for,否则您的代码可能会在过早的阶段停止。您在break之后也不需要return False语句(该功能永远不会到达该行,因为如果它进入False,它将返回if语句)。

最后,将if (n_s % i) == 0:更改为if (n % i) == 0:,因为您需要检查n是否可以被i整除(而不是其平方根)。

这是一个更干净的版本:

import math
def check_n(n):
    n_s = int(math.sqrt(n)+1)
    for i in range(2, n_s):
        if (n % i) == 0:
            return False
    return True
def msg():
    n = int(input('Enter a number, I will return True if it is a prime'))
    return n
print(check_n(msg()))

答案 1 :(得分:1)

首先:你的休息声明是多余的。

第二:对于诸如3的值,for循环永远不会执行,因为值         n_s小于2,因为for循环不执行         python返回默认值None(在返回时返回)         没有指定值)。 因此你的check_n(n)函数必须是

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

答案 2 :(得分:1)

一个班轮:

check_n = lambda n : sum([i for i in range(2, int(math.sqrt(n)+1)) if n % i == 0]) == 0

不要过于复杂化......

答案 3 :(得分:0)

当您选择小于9的任何内容时,您的范围是(2,2)或None。 因此,要解决您的第一个问题:将{2}添加到n_s(输入3)

您的逻辑也存在问题。

您的for循环应该检查n mod i是否为0,而不是n_s

这应该有效:

def main():
    import math
    def check_n(n):
        n_s = int(math.sqrt(n)+1)
        for i in range(2, n_s):
            if (n % i) == 0:
                return False
        return True
    def msg():
        n = int(input('Enter a number, I will return True if it is a prime'))
        return n

    print(check_n(msg()))

main()