0

给定整数 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]
4

3 回答 3

1

您正在根据它们是否可以被列表中的数字整除来测试数字的素数,但只有当它们是回文primes时才添加数字。primes因此,一旦你开始遇到素数大于 11 的合数,你就会开始错误地识别素数。

根据您的功能,symmetricPrime2(12) == 323, 但 323 是复合的 (17 × 19)。

于 2020-07-10T10:01:30.243 回答
1

您的代码中有几处错误或可以改进的地方。

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

您的素数测试是错误的,因为您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
于 2020-07-10T10:03:58.103 回答