找到第n个回文素数我哪里出错了?

2024-10-02 08:17:31 发布

您现在位置:Python中文网/ 问答频道 /正文

给定整数n(1<;=n<;=300),代码需要返回第n个回文素数

我已经编写了下面的代码块来实现上述功能,但就我的一生而言,我无法理解为什么我的代码没有输出给定的预期值。 事实上,我甚至不知道是我的代码错了,还是给定的期望值只是牛市。非常感谢您的指导

预期输出:symmetricPrime2(72)返回70507

实际输出:symmetricPrime2(72)返回30103

def symmetricPrime2(n,candidate=2):
    primes = [2]
    counter = 1
    while True:
        i = 0
        prep = 0
        candidate = candidate + 1
        candidate_sr = str(candidate)
        #test if candidate is prime
        for prime in primes:
            if candidate%prime == 0:
                prep += 1
        #test if candidate is palindromic
        candidate_sr_rev = candidate_sr[len(candidate_sr)::-1]
        
        if prep == 0 and candidate_sr == candidate_sr_rev:
            primes.append(candidate)
        if len(primes) == n:
            break
    return primes[-1]

Tags: 代码testltlenifisrev整数
3条回答

您的素性测试错误,因为您只向primes添加回文素数

def symmetricPrime2(n,candidate=1):
    primes = []
    counter = 0
    while True:
        i = 0
        prep = 0
        candidate = candidate + 1
        candidate_sr = str(candidate)
        #test if candidate is prime
        for prime in primes:
            if candidate%prime == 0:
                prep += 1
        #test if candidate is palindromic
        candidate_sr_rev = candidate_sr[len(candidate_sr)::-1]

        if prep == 0:
            primes.append(candidate)
            if candidate_sr == candidate_sr_rev:
                counter += 1
        if counter == n:
            return candidate

测试数字的素性是基于它们是否可以被primes列表中的数字整除,但如果它们是回文的,则只向primes添加数字。因此,一旦你开始遇到素数因子大于11的复合数,你将开始错误地识别素数

根据您的函数,symmetricPrime2(12) == 323,但是323是复合的(17×19)

您的代码中有一些地方要么是错误的,要么是可以改进的

  1. 您可以使用[2, 3]而不是[2]初始化素数,这允许您从candidate=3开始,并将其递增2而不是1,因为2是唯一的偶数素数
  2. i = 0在代码中没有意义
  3. prep仅用于测试candidate是否为素数。一旦您发现candidate % primeTrue,您就可以break退出for循环,如果您已经找到一个除数,则无需继续测试它
  4. 代码中最大的错误是:所有素数都不是回文。你当然知道,但这是你写的。从11开始,只向列表中添加回文素数(例如,您可以测试并看到13不在primes)。删除if中的and candidate_sr == candidate_sr_rev,以便正确地将素数添加到列表中。由于需要第n个素数,因此有两种选择:
  • 要么定义第二个列表palindromic_primes,将遇到的每个回文素数添加到该列表中,并测试其长度是否等于n
  • 或者只保留遇到的回文素数,当这个数等于n时,可以返回这个回文素数

相关问题 更多 >

    热门问题