2015-04-21 4 views
4

Я пытаюсь создать программу, которая выводит наибольшее простое число, чем это палиндром и меньше 1000. Ожидаемый результат должен быть 929Max Prime Palindrome в Python

Покушение 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: Получение ошибки [имя 'is_prime' не определен]

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 
+0

Ваше состояние возвращается Подопечные. Измените 'while number> maxNumber:' to 'while number

+0

@JakeGriffin Зачем комментировать и отвечать на одно и то же? Двойной эффект? – miradulo

+0

Я удалил ответ из-за других логических ошибок и отправил его вместо комментария. –

ответ

2

Есть несколько проблем с вашим кодом:

  1. Первой версию, логика для контура while обратно
  2. Второго варианта, ваши отступы неправильно. number+=1 является частью блока if, и print не является частью цикла while.
  3. Отпечаток в конце цикла while печатает неправильное значение, так как он выпал из цикла в этой точке для теста while number < maxNumber:.

Try:

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 и генератора:

>>> 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 
+0

Кроме того, вместо проверки на палиндромы можно было бы просто создать палиндромы. Итерирование над 3-значными палиндромами - это не что иное, как повторение (a, b) в [0..9] x [0..9] и рассмотрение (a, b, c) – Josay

+1

@ Джосаи: Правда, но аудитория кажется начинающий Python. Пойдем, пока мы не побежим, нет? Ура! – dawg

+0

Вы все предоставляете отличный совет по ярлыкам, да, я новичок, но я уже вижу, как есть более интересные способы решить этот вопрос. –