我正在编码站点上解决以下问题。它在测试(隐藏测试)的某些边缘情况下失败了,但我不确定它们是什么。有人看到这有什么问题吗?
问题:设 A
是所有素数按顺序压缩在一起的字符串(即 235711131719...
)。给定一个索引 n
,返回一个 5 位数字的字符串,其中第一个数字位于 A 中的索引 n
处。
例如foo(0) => 23571
和 foo(10) => 19232
这是我的代码:
def gen_primes():
A = {}
i = 2
while True:
if i not in A:
yield i
A[i * i] = [i]
else:
for p in A[i]:
A.setdefault(p + i, []).append(p)
del A[i]
i += 1
def answer(n):
counter = 0
prime_string = ""
for p in gen_primes():
if (counter >= n):
prime_string += str(p)
counter += len(str(p))
if len(prime_string) >= 5:
break
return prime_string[:5]
最佳答案
我认为对于多于一位数的质数,这可能会中断:
假设我们已经得到了三位数的质数,例如 103。
Counter
是 10,n
是 11(这只是一个例子,不知道会不会出现这个星座)
然后我们需要使用“103”中的数字“03”。但是由于 counter
小于 n
,整个质数被跳过。该程序将继续执行 107。
您可以通过完全删除 counter
来解决此问题:始终向字符串添加素数,如果字符串的长度为 n+5
或更长则跳出循环.
编辑:
我已经检查了您的代码:例如 answer(5)
和 answer(6)
。使用您的代码,这两个调用都会产生“13171”。 “11”的第二个数字被跳过。
使用这段代码:
def answer(n):
counter = 0
prime_string = ""
for p in gen_primes():
prime_string += str(p)
if len(prime_string) >= n+5:
break
return prime_string[n:n+5]
它们导致
11317 # answer(5)
13171 # answer(6)
关于python - 质数生成难题(边缘情况),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41459391/