【发布时间】:2021-05-29 10:33:36
【问题描述】:
任务取自www.codewars.com
素数不规则间隔。例如从 2 到 3 步长是 1。从 3 到 5 步长是 2。从 7 到 11 是 4。 在 2 到 50 之间,我们有以下成对的 2 步素数:
3, 5 - 5, 7, - 11, 13, - 17, 19, - 29, 31, - 41, 43
我们将编写一个带参数的函数步骤:
g (integer >= 2) 表示我们正在寻找的步骤,
m (integer >= 2) 给出搜索的开始(包括 m),
n (integer >= m) 结束搜索(n 包括在内)
在上面的示例中,step(2, 2, 50) 将返回 [3, 5],即 2 到 50 之间的第一对,分 2 步。
所以这个函数应该返回两个素数中的第一对 如果这些 g 步为素数,则在限制 m 之间以 g 步长间隔 数字存在,否则为 nil 或 null 或 None 或 Nothing 或 [] 或 "0, 0" 或 {0, 0} 或 0 0(取决于语言)。
例子:step(2, 5, 7) --> [5, 7] or (5, 7) or {5, 7} or "5 7"
step(2, 5, 5) --> nil 或 ... 或 Ocaml 中的 [] 或 C++ 中的 {0, 0}
step(4, 130, 200) --> [163, 167] or (163, 167) or {163, 167}
在“测试”中查看您的语言的更多示例
备注:([193, 197] 也是这样一个130到200之间的4步素数 但它不是第一对)。
step(6, 100, 110) --> [101, 107] 虽然在 101 之间有一个素数 和 107 是 103; 101-103 对是 2 步。
这是我的解决方案,它运行良好,需要的时间比测试所需的要多,但是,我正在尝试优化此代码以使其更省时。
def step(g,m,n):
count = 0
list= []
list2 = []
for num in range(m,n+1):
if all(num%i!=0 for i in range(2,num)):
count += 1
list.append(num)
for k in list:
for q in list:
if (q-k) > 0:
if (q-k) == g:
list2.append(k)
list2.append(q)
if not list2:
return
else:
return [list2[0],list2[1]]
如果您有任何建议甚至是示例代码,我将不胜感激。
【问题讨论】:
标签: python list for-loop if-statement primes