Проверка палиндромных треугольных квадратов в Python - PullRequest
0 голосов
/ 08 ноября 2018
nm = 0
def infinity(start=0):
    n = start
    while True:
        yield n
        n += 1
while nm in infinity(1):
    nT = nm*(nm+1)/2
    nS = nm**2
    nR = int(str(nm)[::-1])
    if nT==nS==nR:
        N = nT
        print(N)
    nm = nm+1

Я пытался написать программу, которая проверяет каждое число от 0 до бесконечности, если оно удовлетворяет 3 требованиям. Они должны быть палиндромными, треугольными и квадратными одновременно. мне трудно понять, как исправить математическую часть кода.

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Для генерации квадратных треугольных чисел существует очень простое повторение . Таким образом, вы можете генерировать только эти числа, не тратя время на проверку всех натуральных элементов.

Единственное, что вам нужно сделать - проверить, является ли число палиндромом

def SqTr():
    a, b = 0, 1
    for i in range(10):
        a, b = 2 + 34 * a - b, a
        print(a)

SqTr()
0 голосов
/ 08 ноября 2018

Проблема в вашем коде - общая логика. Вы смотрите на каждое положительное целое число, пытаясь решить, является ли оно треугольным, квадратным и палиндромом.

Однако вы не проверяете, является ли nm треугольным числом или квадратом. Вы фактически вычисляете nm th треугольное число и nm th квадратное число. За исключением первых, 0 и 1, они никогда не равны друг другу или nm, поэтому ваши тесты не пройдены. Вместо этого вам следует проверить, является ли nm треугольным числом и nm - квадратным числом. Эти тесты сложнее для очень больших значений nm, и я рекомендую другой подход.

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

Все эти проблемы могут быть исправлены, но ваша программа будет чрезвычайно медленной. На этой странице Википедии показаны первые 12 квадратных треугольных чисел. Последний имеет 16 цифр. За исключением первых двух, а именно 0 и 1, ни один не является палиндромом. Могут быть палиндромы выше, но вашей программе потребуется почти вечность, чтобы найти их.

Я рекомендую другой подход. Используйте намного более быстрый метод, чтобы пройти через квадратные треугольные числа, избегая всех других чисел. Страница Википедии дает несколько методов. Затем проверьте каждый из них, если это палиндром. Python может обрабатывать большие числа, хотя вычисления будут выполняться медленнее, поэтому вы можете найти палиндром.

Вот простой способ перебрать только квадратные треугольные числа, пропуская 0 и 1, которые являются тривиальными.

nold = 0
n = 1
for nm in infinity(2):
    nold, n = n, 34 * n - nold + 2
    # check if n is a palindrome

Это, конечно, бесконечный цикл. Обратите внимание, что nm фактически никогда не используется, но это индекс квадратного треугольного числа n. Расчет происходит из первого рекуррентного отношения здесь . Объяснение включает решение уравнения Пелла, которое обычно использует непрерывные дроби. Дайте мне знать, если вам действительно нужно больше информации об этом, хотя статья в Википедии объясняет это больше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...