我正在编码站点上解决以下问题。对于测试(隐藏测试)中的某些边缘情况,它失败了,但我不确定它们是什么。有人看到这有什么问题吗?
问题:假设A是一串所有素数按顺序压缩在一起(即235711131719...)。给定一个索引n,返回一个由 5 位数字组成的字符串,其中第一个数字n位于 A中的索引处。
例如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]
Run Code Online (Sandbox Code Playgroud)
我认为这对于超过一位数的素数可能会破坏:
假设我们已经得到了三位数的素数,比如 103。
Counter是 10n是 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]
Run Code Online (Sandbox Code Playgroud)
他们导致
11317 # answer(5)
13171 # answer(6)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
326 次 |
| 最近记录: |