为什么我的代码没有显示正确的输出?

时间:2018-10-15 10:35:46

标签: python python-3.x

我有一个代码检查数字是否为质数,并相应地输出“是”或“否”。但是,当我输入1763时,即使它不是素数,它也会输出“是”。该代码通过检查数字是否可以被2到n-1之间的任何数字整除来检查数字是否为质数。因此,当我输入1763时,它应该输出“ No”,因为1763可以被41整除。我的代码出了什么问题?

$query="SELECT * FROM table_name WHERE MATCH (column_name) AGAINST 
  ('search_word' IN NATURAL LANGUAGE MODE)" ;

3 个答案:

答案 0 :(得分:1)

问题是您没有考虑所有除数。第一个条件(if n%i==0:)为假时,就执行第二个elif条件并打印“是”。

解决方案:您可以使用一个标志,当找到除数时,该标志将仅变为 ,这意味着该数字不是素数。以下是您的修改过的代码(仅显示部分代码,其余部分与您相同)。正如@bereal在评论中指出的那样,您不需要迭代最多n,而只需要迭代平方根sqrt(n)math.ceil返回最接近的四舍五入整数。

import math
def isPrime(n):
    flag = 0
    if n==2:
        print("Yes")
        return
    else:
        # for i in range (2, n):
        for i in range (2, math.ceil(np.sqrt(n)) + 1):
            if n%i==0:
                print("No")
                flag = 1
                break

    if not flag:
        print ("Yes")

1763
No

答案 1 :(得分:0)

在循环中,即使无法证明它不是素数,您也会在第一次迭代时中断。

只有在检查了所有可能的除数到n之后,才需要打印是(实际上仅检查所有向上n的平方的数字就足够了。)

for i in range (2,n):
    if n%i==0:
        print("No")
        return
print("Yes")

答案 2 :(得分:0)

只有在遍历所有可能的除数而不找到一个除数之后,才应将数字声明为质数。为此,您可以改用for-else构造,其中else块仅在for循环没有被break语句中止的情况下执行:

def isPrime(n):
    if n==2:
        print("Yes")
    else:
        for i in range (2,n):
            if n%i==0:
                print("No")
                break
        else:
            print("Yes")