Нахождение nth Palindromi c Prime - Где я go ошибся? - PullRequest
0 голосов
/ 10 июля 2020

Учитывая целое число n (1 <= n <= 300), код должен возвращать n-й Палиндроми c Prime. </p>

Я написал приведенный ниже блок кода для достижения вышеуказанного, но для жизнь меня я не могу понять, почему мой код не выводит заданное ожидаемое значение. На самом деле я даже не знаю, ошибочен ли мой код или данное ожидаемое значение просто бычье. Был бы очень признателен за руководство.

Ожидаемый результат : symricPrime2 (72) возвращает 70507

Фактический результат : symricPrime2 (72) возвращает 30103

def symmetricPrime2(n,candidate=2):
    primes = [2]
    counter = 1
    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 and candidate_sr == candidate_sr_rev:
            primes.append(candidate)
        if len(primes) == n:
            break
    return primes[-1]

Ответы [ 3 ]

1 голос
/ 10 июля 2020

Есть несколько вещей, которые либо ошибочны, либо могут быть улучшены в вашем коде.

  1. Вы можете инициализировать простые числа с помощью [2, 3], а не [2], что позволяет начать с candidate=3 и увеличить его на 2 вместо 1, поскольку 2 - единственное четное простое число.
  2. i = 0 не имеет смысла в вашем коде
  3. prep используется только для проверки того, candidate - простое число. Как только вы обнаружите, что candidate % prime равно True, вы можете break из своего for l oop, нет необходимости продолжать тестирование, если вы уже нашли делитель.
  4. Самая большая ошибка в вашем коде: все простые числа не являются палиндромами c. Конечно, вы это знаете, но это то, что вы написали. Начиная с 11, вы добавляете в свой список только простые числа, которые являются палиндромами c (например, вы можете проверить и увидеть, что 13 отсутствует в primes). Удалите and candidate_sr == candidate_sr_rev из if, чтобы правильно добавить простые числа в свой список. Поскольку вам нужно n -ое простое число, у вас есть два варианта:
  • либо вы определяете второй список palindromic_primes, к которому вы добавляете все палиндроми c простые числа и проверьте, чтобы его длина была равна n
  • , или вы просто сохраните количество встреченных вами простых чисел палиндроми c, и когда это число будет равно n, вы можете вернуть это палиндроми c простое число.
1 голос
/ 10 июля 2020

Вы проверяете числа на простоту, основываясь на том, делятся ли они на числа в списке primes, но вы добавляете числа к primes, только если они являются палиндромами c. В результате, как только вы начнете сталкиваться с составными числами с простыми множителями больше 11, вы начнете неправильно определять простые числа.

Согласно вашей функции, symmetricPrime2(12) == 323, но 323 составное (17 × 19 ).

0 голосов
/ 10 июля 2020

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

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...