python - 质数生成难题(边缘情况)

标签 python primes

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

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

例如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]    

最佳答案

我认为对于多于一位数的质数,这可能会中断:

假设我们已经得到了三位数的质数,例如 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/

相关文章:

python - 将字符串打印到文本文件

python - Python语言如何知道标识符的类型?

python - Web2py - 使用单独的 SQL 数据库进行归档时的键/约束问题

c++ - 我的埃拉托色尼筛法耗时太长

language-agnostic - 计算无限质数的方法

python - 欧拉计划 92

python - Django View 限制子查询

python - 我怎样才能让我的素数生成器运行得更快

c# - 将在文件中查找素数的算法的结果存储 (C#)

java - 我执行此算法以计算前 N 个素数有什么问题?