Python 按给定间隔打印素数的反向列表
所以我想出了如何以给定区间的相反形式打印所有素数,但是对于一个测试用例,当他们将下限设置为1时,它也会打印出来。我们知道1不是质数 我的代码是: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] >>&
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
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]