Python中的Max Prime Palindrome

时间:2015-04-21 14:21:37

标签: python for-loop primes palindrome

我试图创建一个程序,输出的最高素数比回文数小,并且小于1000.预期输出应为929

尝试1

number = 1
prime = 1
maxNumber = 1000

while number > maxNumber:
    if str(number) == str(number)[::-1]:        #Inverts the string
        for number in range(number,maxNumber):  #Increments number until 1000
            for i in range(2, number):          #Checks current number and divides all lower
                if number % i == 0:
                    break
                else:
                    prime = number              
print(prime)

尝试2

number = 3
prime = 3
maxNumber = 1000

while number < maxNumber:
    if str(number) == str(number)[::-1]:        #Inverts the string
        for i in range(2, number):
            if number % i == 0:
                break
            else:
                prime = number
        number+=1
print(prime)

尝试3,我按照建议分开两个功能以减少处理时间

for number in xrange(1000):
    if str(number) == str(number)[::-1]: and is_prime(number):
        prime = number
print(number)

#Method to find prime numbers
def is_prime(n):
    if n == 2 or n == 3: 
        return True
    elif n < 2 or n%2 == 0: 
        return False
    elif n < 9: 
        return True
    elif n%3 == 0: 
        return False
    r = int(n**0.5)
    f = 5
    while f <= r:
        if n%f == 0: 
            return False
        if n%(f+2) == 0: 
            return False
        f +=6
    return True   

尝试4:收到错误[name&#39; is_prime&#39;未定义]

for number in range(1000,3,-1):
    if str(number) == str(number)[::-1] and is_prime(number):      
        print(number)  
        break  

#Method to check if number is prime  
def is_prime(n):
    if n == 2 or n == 3: return True
    if n < 2 or n%2 == 0: return False
    if n < 9: return True
    if n%3 == 0: return False
    r = int(n**0.5)
    f = 5
    while f <= r:
        if n%f == 0: return False
        if n%(f+2) == 0: return False
        f +=6
    return True  

最终解决方案:谢谢大家的帮助。这比我预期的更有帮助。

#Method to check if number is prime  
def is_prime(n):
    if n == 2 or n == 3: return True
    if n < 2 or n%2 == 0: return False
    if n < 9: return True
    if n%3 == 0: return False
    r = int(n**0.5)
    f = 5
    while f <= r:
        if n%f == 0: return False
        if n%(f+2) == 0: return False
        f +=6
    return True  

#Checking for numbers that are palindromes and prime
for number in range(1000,3,-1):
    if str(number) == str(number)[::-1] and is_prime(number):
        print(number)  
        break

1 个答案:

答案 0 :(得分:2)

您的代码存在以下问题:

  1. 第一个版本,while循环的逻辑是向后的
  2. 第二个版本,你的缩进是错误的。 number+=1是上面if块的一部分,print不是while循环的一部分。
  3. while循环末尾的打印输出错误值,因为此时测试while number < maxNumber:已退出循环。
  4. 尝试:

    for n in xrange(1000):
        if str(n)==str(n)[::-1] and is_prime(n):
            print n
    

    您可以轻松转变为while循环:

    n=0
    while n<1000:
        if str(n)==str(n)[::-1] and is_prime(n):
            print n
        n+=1    
    

    我建议从回文测试中分离出主要测试。因为测试一个字符串作为回文是快速的,相比之下测试一个数字是一个素数(对于更大的数字)测试回文首先。

    有一个功能可以将数字测试为素数here


    根据您的评论,我现在看到您正在寻找最大而不是所有主要的回文。

    要获得最大素数回归,您可以从最大值向后退一步。由于您不知道该最大值是否为素数或者是否为素数,您需要逐步减去-1(或者编写一些混淆概念的其他代码):

    for number in range(1000,3,-1):
        if str(number) == str(number)[::-1] and is_prime(number):      
            print(number)  
            break  
    

    你可以通过使用next和生成器来制作'Pythonic':

    >>> next(n for n in range(1000,3,-1) if str(n)==str(n)[::-1] and is_prime(n)) 
    929
    

    或者,将max与素数列表一起使用(由于必须全部生成素数,因此效率会降低):

    >>> max(n for n in range(1000) if str(n)==str(n)[::-1] and is_prime(n)) 
    929