Python 按给定间隔打印素数的反向列表

Python 按给定间隔打印素数的反向列表,python,Python,所以我想出了如何以给定区间的相反形式打印所有素数,但是对于一个测试用例,当他们将下限设置为1时,它也会打印出来。我们知道1不是质数 我的代码是: def prime_list_reversed(x, y): """ Input: the number x and y Output: all prime numbers within [x,y] in reverse order >>> prime_list_reversed(3, 10) [7, 5, 3] >>&

所以我想出了如何以给定区间的相反形式打印所有素数,但是对于一个测试用例,当他们将下限设置为1时,它也会打印出来。我们知道1不是质数

我的代码是:

def prime_list_reversed(x, y):
"""
Input: the number x and y
Output: all prime numbers within [x,y] in reverse order

>>> prime_list_reversed(3, 10)
[7, 5, 3]
>>> prime_list_reversed(3, 3)
[3]
>>> prime_list_reversed(2, 2)
[2]
"""
assert type(x) == int, "first argument must be an integer"
assert type(y) == int, "second argument must be an integer"
assert x > 1, "1 is not a prime number"
assert y >= x,  "second argument must be >= the first one"

# YOUR CODE IS HERE #
lst = []
for i in range(x, y + 1):
    for c in range(2, i):
        if (i % c) == 0:
            break
    else:
        lst.append(i)
return list(reversed(lst))
一个测试用例

prime_list_reversed(1, 3)
[3,2,1]

基本检查器将为
i=1
构造
范围(2,1)
,但该范围为空。事实上:

这意味着没有对
i=1
进行检查,因此您的程序将其视为素数。我们可以在这里做两件事:

  • if
    语句检查
    i==1
    以避免发出
  • 首先确保外部范围永远不会发出
    1
  • 但它仍然可以提高效率。如果一个数字a可以被b整除,我们知道有一个c=a/b。这意味着如果b>√a、 然后c≤√A.我们可以利用这个属性:它足以检查√i、 因为我们知道,除此之外,我们已经通过其他部门对其进行了测试:

    from math import ceil, sqrt
    
    def prime_list_reversed(x, y):
        # ...
        lst = []
        for i in range(y - (~y & 1), max(3, x) - 1, -2):
            for c in range(3, ceil(sqrt(i))+1, 2):
                if not i % c:
                    break
            else:
                lst.append(i)
        if x <= 2 < y:
            lst.append(2)
        return lst

    你认为
    range(2,1)
    会返回什么?我可以断言用户必须选择一个大于1的数字,但是我认为如果他们可以使用大于0的下限会更好
    range(2,1)
    是空的,因为上限小于下限,因此你永远不会执行任何检查。将发出
    1
    3
    (或任何其他范围)之间的所有数字。范围(2,1)将返回nothing@WillemVanOnsem“所有介于1和3(或任何其他范围)之间的数字都将发出。”您是说“省略”吗?
    def prime_list_reversed(x, y):
        # ...
        lst = []
        for i in range(max(2, x), y + 1):
            for c in range(2, i):
                if (i % c) == 0:
                    break
            else:
                lst.append(i)
        return list(reversed(lst))
    def prime_list_reversed(x, y):
        # ...
        lst = []
        for i in range(y, max(2, x) - 1, -1):
            for c in range(2, i):
                if (i % c) == 0:
                    break
            else:
                lst.append(i)
        return lst
    def prime_list_reversed(x, y):
        # ...
        lst = []
        for i in range(y - (~y & 1), max(3, x) - 1, -2):
            for c in range(3, i, 2):
                if (i % c) == 0:
                    break
            else:
                lst.append(i)
        if x <= 2 < y:
            lst.append(2)
        return lst
    from math import ceil, sqrt
    
    def prime_list_reversed(x, y):
        # ...
        lst = []
        for i in range(y - (~y & 1), max(3, x) - 1, -2):
            for c in range(3, ceil(sqrt(i))+1, 2):
                if not i % c:
                    break
            else:
                lst.append(i)
        if x <= 2 < y:
            lst.append(2)
        return lst
    from math import ceil, sqrt
    
    def prime_list_reversed(x, y):
        # ...
        for i in range(y - (~y & 1), max(3, x) - 1, -2):
            for c in range(3, ceil(sqrt(i))+1, 2):
                if not i % c:
                    break
            else:
                yield i
        if x <= 2 < y:
            yield 2
    >>> list(prime_list_reversed(1, 500))
    [499, 491, 487, 479, 467, 463, 461, 457, 449, 443, 439, 433, 431, 421, 419, 409, 401, 397, 389, 383, 379, 373, 367, 359, 353, 349, 347, 337, 331, 317, 313, 311, 307, 293, 283, 281, 277, 271, 269, 263, 257, 251, 241, 239, 233, 229, 227, 223, 211, 199, 197, 193, 191, 181, 179, 173, 167, 163, 157, 151, 149, 139, 137, 131, 127, 113, 109, 107, 103, 101, 97, 89, 83, 79, 73, 71, 67, 61, 59, 53, 47, 43, 41, 37, 31, 29, 23, 19, 17, 13, 11, 7, 5, 3, 2]