Member 14517556 Ответов: 3

Специальные Пифагора тройки


В пифагоровы тройки,
a^2 + b^2 = c^2,
существует один (a,b,c)
для которых a+b+c = 1000.
для этого a,b,c находят abc.

Я прилагаю свои коды. Я думаю, что моя логика верна, но не получаю ответа. Я получаю ошибку "превышен лимит времени". Ранее я также сталкивался с той же проблемой всякий раз, когда использовал большие числа в цикле for. Существует ли какой - либо предел для числа, которое мы вводим в функцию диапазона?Есть ли какой-то другой метод для выполнения такой задачи, код с большими числами?

Заранее спасибо.

Что я уже пробовал:

for a in range(1,1000):
    for b in range(1,1000):
        for c in range(1,1000):
            if a**2 + b**2 == c**2:
                if a+b+c == 1000:
                    print(a*b*c)

3 Ответов

Рейтинг:
20

OriginalGriff

Ваш подход-это нерафинированный метод "грубой силы", который использует вложенные циклы. Таким образом, код внутри всех трех циклов выполняется 1000 раз для c, который выполняется 1000 раз для b, который выполняется 1000 раз для a: это означает, что для вычисления количества раз первый цикл выполняется 1000 раз для b. if тест выполняется просто, просто мультиполь 1000 на 1000 на 1000: 1,000,000,000 - один миллиард раз. Независимо от того, насколько быстр ваш процессор, независимо от того, насколько быстр код внутри всех трех циклов, это займет значительное время. И если он найдет результат с первой попытки - чего он не сделает, но потерпите меня - он все равно сделает оставшиеся 999 999 999 итераций, прежде чем закончит.

Подумайте лучше об алгоритме: есть ли способ значительно уменьшить количество значений? Ну да. Для начала вы можете исключить внутренний цикл, потому что вы знаете, что a + b + c = 1000, следовательно, c = 1000 - (a + b). Для каждой комбинации a и b C-это фиксированное значение, так что вам вообще не нужно зацикливаться! Внезапно вы получаете 1 000 000 тестов, и они становятся проще. Добавьте код для выхода, если вы найдете правильный результат, и это отбросит больше циклов.

И это до того, как вы начнете использовать реальные формулы для ее решения: Пифагорейская тройка - Википедия[^]

Серьезно - это ваше домашнее задание, а не наше: отбросьте подход грубой силы и подумайте о более разумных решениях. А самое быстрое решение абсолютно простое:

print "375^2 + 200^2 = 425^2\n"
Но это не даст тебе никаких отметок. :смеяться:


CPallini

5.

Рейтинг:
2

Richard MacCutchan

Позвольте мне предложить вам прекратить тратить свое время на эти математические задачи, поскольку они не учат вас программированию. Идти к Учебник по Python — документация по Python 3.7.4rc1[^] и выучить настоящий язык.


Рейтинг:
2

Patrice T

Цитата:
получаю ошибку "превышен лимит времени".

Это вызов вам с сайта вызова, ответ никогда не будет самой жестокой силовой атакой, как ваше решение.
Цитата:
Существует ли какой - либо предел для числа, которое мы вводим в функцию диапазона?Есть ли какой-то другой метод для выполнения такой задачи, код с большими числами?

Ваша проблема не здесь, проблема в том, что вы не сделали никакого анализа.
a, b, c не являются свободными независимыми переменными, они связаны, ограничены, вы должны воспользоваться ограничениями, чтобы уменьшить поиск решений.
Подумайте об этом: когда вы знаете a и b, сколько значений возможно для c ?