简体   繁体   English

素数检查程序是否不能消除5的整数?

[英]Prime checker not eliminating numbers divisible by 5?

My program looks at an input and then return a list of all prime numbers less than or equal to the number. 我的程序查看输入,然后返回所有小于或等于该数字的质数的列表。 It currently is not eliminating numbers divisible by 5, and my 'Testing divisibility by' statement is returning 3 each time. 目前尚不能消除被5整除的数字,而我的“测试除法依据”语句每次都返回3。

import math


def is_prime(number):
    if number % 2:
        # equivalent to if number % 2 != 0 because if number is
        # divisible by 2 it will return 0, evaluating as 'False'.
        for num in range(3, int(math.sqrt(number)) + 1, 2):
            print("Testing divisibility by {}".format(num))
            if number % num == 0:
               return False
            else:
                return True
    else:
        return False



def list_of_primes(number):
    prime_list = []
    for x in range(2, number + 1):
            if is_prime(x):
                prime_list.append(x)
    return prime_list



def main():
    while True:
        usr_in = eval(input("Please enter a positive number"
                            " greater than 1: "))
        if usr_in > 1: break
        else:
            print("Number not valid.")


    prime_list = list_of_primes(usr_in)
    for x in prime_list:
        print(x)


if __name__ == '__main__':
    main()

The problem lies in the if-else within your for-loop: 问题出在您的for循环中的if-else:

def is_prime(number):
    if number % 2:
        for num in range(3, int(math.sqrt(number)) + 1, 2):
            print("Testing divisibility by {}".format(num))
            if number % num == 0:
               return False
            else:
                return True
    else:
        return False

Consider the case when number is 25 . 考虑number25的情况。 In the first iteration of your for-loop, num is 3 . 在for循环的第一次迭代中, num3 Then, since number%num (ie 25%3 ) is not 0 , False is not returned, and the else is entered and True is returned. 然后,由于number%num (即25%3 )不为0 ,因此不返回False ,而输入else并返回True

This is what you want to do instead (notice there's no else in the for-loop): 这是您要执行的操作(请注意,for循环中没有else ):

import math


def is_prime(number):
    if number % 2:
        # equivalent to if number % 2 != 0 because if number is
        # divisible by 2 it will return 0, evaluating as 'False'.
        for num in range(3, int(math.sqrt(number)) + 1, 2):
            print("Testing divisibility by {}".format(num))
            if number % num == 0:
                return False
        return True
    else:
        return False

Remove your "is_prime" and "list_of_primes" and replace with these: 删除“ is_prime”和“ list_of_primes”并替换为:

def list_of_nonprimes(number):
    return [j for i in range(2, 8) for j in range(i*2, number, i)]

def list_of_primes(number):
    noprimes = list_of_nonprimes(number)
    return [x for x in range(2, number) if x not in noprimes]

... which, by the way, I got from a List Comprehension Tutorial . ...,顺便说一句,我来自列表理解教程 Also, I don't think you need to import math in Python 3.4+. 另外,我认为您不需要在Python 3.4+中导入数学。

Please refer to this post for a very nice explanation of how this works. 请参阅这篇文章,以很好地解释其工作原理。

Hope this helps! 希望这可以帮助!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM