while循环具有多种条件。蟒蛇

时间:2014-08-14 07:55:43

标签: python

我正在编写一个函数,给定一个随机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

3 个答案:

答案 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循环时都会递增。

您需要将主要检查和回文检查分开。怪异的方法是最简单的。