素数生成谜题(边缘情况)

use*_*175 6 python primes

我正在编码站点上解决以下问题。对于测试(隐藏测试)中的某些边缘情况,它失败了,但我不确定它们是什么。有人看到这有什么问题吗?

问题:假设A是一串所有素数按顺序压缩在一起(即235711131719...)。给定一个索引n,返回一个由 5 位数字组成的字符串,其中第一个数字n位于 A中的索引处。

例如foo(0) => 23571foo(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)

lhk*_*lhk 3

我认为这对于超过一位数的素数可能会破坏:

假设我们已经得到了三位数的素数,比如 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)