我正在编写一个函数,给定一个随机int,将返回下一个同时是素数和回文的int。即getint(13)将返回101。 此函数的一个条件是不允许递归。
我在哪里错了?
def golf(number):
x = number +1
for i in range(2, x):
while str(x) != str(x)[::-1] and x % i == 0:
x += 1
return x
答案 0 :(得分:1)
您的for
循环只会达到x
的初始值:range(2,x)
仅在x = number + 1
之后计算一次。因此,在循环中增加x
并不会产生任何影响。考虑使用while
循环,例如:
i = 2
while i <= x:
...
i += 1
你可能应该首先检查x
是一个回文(一个“便宜”的操作)然后,如果是,检查天气它是素数(“昂贵的”操作),不要尝试全部在几个没有意义的嵌套循环中。
答案 1 :(得分:1)
将问题分成更小的部分。您将更容易理解正在发生的事情:
def golf(number):
x = number + 1
while True:
if is_palindrome(x) and is_prime(x):
return x
x += 1
现在,您所要做的就是实施is_palindrome(x)
和is_prime(x)
:
import math
def is_prime(x):
for i in xrange(2, math.ceil(math.sqrt(x))+1):
if x % i == 0:
return False
return True
def is_palindrome(x):
x = str(x)
return x == x[::-1]
旁注:如果math.ceil(math.sqrt(x))+1
正确地适用于正方形(即不依赖于浮动),则int(...)+1
可能是一种过度杀伤(可能math.sqrt
就足够了)点计算使math.sqrt(a*a)==a
始终为真。那么在最坏的情况下,循环将再进行一次迭代。更好的安全然后抱歉。
答案 2 :(得分:0)
在您的代码中:
def golf(number):
x = number +1
for i in range(2, x):
while str(x) != str(x)[::-1] and x % i == 0:
x += 1
return x
程序执行不会满足while
循环的一半时间,因为任何偶数都不会被任何奇数整除,而反之亦然。同样在for
循环的单次迭代中,x
每次满足while
循环时都会递增。
您需要将主要检查和回文检查分开。怪异的方法是最简单的。