Python 寻找第n个回文素数-我哪里出错了?
给定整数n(1你在测试数字的素数性,是基于它们是否可以被Python 寻找第n个回文素数-我哪里出错了?,python,python-3.x,algorithm,Python,Python 3.x,Algorithm,给定整数n(1你在测试数字的素数性,是基于它们是否可以被素数列表中的数字整除,但是如果它们是回文的,你只能在素数列表中添加数字。因此,一旦你开始遇到素数因子大于11的复合数,你就会开始错误地识别素数 根据您的函数,symmetricPrime2(12)=323,但323是复合的(17×19).您正在测试数字的素数性,测试的基础是它们是否可以被素数列表中的数字整除,但是如果它们是回文的话,您只能将数字添加到素数中。因此,一旦您开始遇到素数因子大于11的复合数,您将开始识别不正确的素数泰利 根据你的
素数列表中的数字整除,但是如果它们是回文的,你只能在素数列表中添加数字。因此,一旦你开始遇到素数因子大于11的复合数,你就会开始错误地识别素数
根据您的函数,symmetricPrime2(12)=323
,但323是复合的(17×19).您正在测试数字的素数性,测试的基础是它们是否可以被素数列表中的数字整除,但是如果它们是回文的话,您只能将数字添加到素数中。因此,一旦您开始遇到素数因子大于11的复合数,您将开始识别不正确的素数泰利
根据你的函数,symmetricPrime2(12)=323,但323是复合的(17×19)。你的素数测试是错误的,因为你只添加了回文素数
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
当您只添加回文素数时,您的素数测试是错误的
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
您的代码中有一些地方要么是错误的,要么是可以改进的
您可以使用[2,3]
而不是[2]
初始化素数,这允许您从candidate=3
开始,并将其递增2而不是1,因为2是唯一的偶数素数
i=0
在您的代码中没有意义
prep
仅用于测试candidate
是否为素数。一旦您发现candidate%prime
为True
,您就可以中断
for循环,如果您已经找到除数,则无需继续测试它
代码中最大的错误是:所有的素数都不是回文的。当然你知道这一点,但这是你写的。从11开始,你只在列表中添加回文的素数(例如,你可以测试并看到13不在素数中)。删除if
中的和candidate_sr==candidate_sr_rev
,以便正确地将素数添加到列表中。由于您需要第n个素数,因此有两个选择:
- 或者定义第二个列表
回文素数
,将遇到的每个回文素数添加到该列表中,并测试其长度是否等于n
- 或者只保留遇到的回文素数,当该数等于
n
时,可以返回该回文素数
代码中有几点要么是错误的,要么是可以改进的
您可以使用[2,3]
而不是[2]
初始化素数,这允许您从candidate=3
开始,并将其递增2而不是1,因为2是唯一的偶数素数
i=0
在您的代码中没有意义
prep
仅用于测试candidate
是否为素数。一旦您发现candidate%prime
为True
,您就可以中断
for循环,如果您已经找到除数,则无需继续测试它
代码中最大的错误是:所有的素数都不是回文的。当然你知道这一点,但这是你写的。从11开始,你只在列表中添加回文的素数(例如,你可以测试并看到13不在素数中)。删除if
中的和candidate_sr==candidate_sr_rev
,以便正确地将素数添加到列表中。由于您需要第n个素数,因此有两个选择:
- 或者定义第二个列表
回文素数
,将遇到的每个回文素数添加到该列表中,并测试其长度是否等于n
- 或者只保留遇到的回文素数,当该数等于
n
时,可以返回该回文素数
你说你不知道你的代码是否错了。你试过测试它的小值n吗?前20个左右的回文素数是在线的,这样你就可以对照它们检查你的代码。你只测试每个候选的回文素数,而不是所有的素数。保留单独的素数和回文列表。你说你不知道您的代码错误。您是否尝试过测试n的小值?前20个左右的回文素数处于联机状态,以便您可以对照它们检查代码。您只针对回文素数而不是所有素数测试每个候选项。保留单独的素数和回文素数列表。