给定整数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]
您的素性测试错误,因为您只向
primes
添加回文素数测试数字的素性是基于它们是否可以被
primes
列表中的数字整除,但如果它们是回文的,则只向primes
添加数字。因此,一旦你开始遇到素数因子大于11的复合数,你将开始错误地识别素数根据您的函数,
symmetricPrime2(12) == 323
,但是323是复合的(17×19)您的代码中有一些地方要么是错误的,要么是可以改进的
[2, 3]
而不是[2]
初始化素数,这允许您从candidate=3
开始,并将其递增2而不是1,因为2是唯一的偶数素数李>i = 0
在代码中没有意义prep
仅用于测试candidate
是否为素数。一旦您发现candidate % prime
是True
,您就可以break
退出for循环,如果您已经找到一个除数,则无需继续测试它李>primes
)。删除if
中的and candidate_sr == candidate_sr_rev
,以便正确地将素数添加到列表中。由于需要第n
个素数,因此有两种选择:palindromic_primes
,将遇到的每个回文素数添加到该列表中,并测试其长度是否等于n
n
时,可以返回这个回文素数李>相关问题 更多 >
编程相关推荐