К основному контенту

Задача 9. Особая тройка Пифагора

Условие задачи:

Тройка Пифагора - три натуральных числа a < b < c, для которых выполняется равенство
a2 + b2 = c2
Например, 32 + 42 = 9 + 16 = 25 = 52.
Существует только одна тройка Пифагора, для которой a + b + c = 1000.
Найдите произведение abc.

Решение:
Первые формулы зависимостей троек Пифагора известны из трудов Эвклида 2100 г до н.э, самая известная из них:
          a = 2mn, b = m2  n2, c = m2 + n2 , m > n

Ну что же, попробуем ее реализовать в коде.
В первую очередь я обнаружил что в Python нет встроенной функции умножения списков, реализуем ее в лоб:

def listmult(lst):
    s=1
    for i in lst:
        s*=i
    return s

Далее объявим функцию, которая перебирает все возможные значения m/n до тех пор, пока сумма троек не будет равна передаваемому значению stop. Аргумент step задает диапазон для перебора m,n и увеличивается в двое если при достижении значения stop мы так и не нашли нужную тройку:

def fibs(stop,step):
    p=step
    fib=[]
    while True:
        for n in range(p-(p-1),p):
            for m in range(p-(p-2),p+1):
                if m>n:
                    fib=[2*n*m,(m**2)-(n**2),(m**2)+(n**2)]
                    if sum(fib)==stop:
                        return listmult(fib)
        p+=step
print(fibs(1000,100))

  Выражение  fib=[2*n*m,(m**2)-(n**2),(m**2)+(n**2)]  каждый раз задает значение 3-ки.
Код не особо эффективен но для данной задачи работает быстро, так что условие выполнено, задача решена 

Популярные сообщения из этого блога

Задача №1 Сумма чисел, кратных 3 м и 5-ти

 . Задача №1 Если выписать все натуральные числа меньше 10, кратные 3 или 5, то получим 3, 5, 6 и 9. Сумма этих чисел - 23. Найдите сумму всех чисел меньше 1000, кратных 3 или 5. Решение

Задача 21. Дружественные числа

Пусть d( n ) определяется как сумма делителей  n  (числа меньше  n , делящие  n  нацело). Если d( a ) =  b  и d( b ) =  a , где  a  ≠  b , то  a  и  b  называются дружественной парой, а каждое из чисел  a  и  b  - дружественным числом. Например, делителями числа 220 являются 1, 2, 4, 5, 10, 11, 20, 22, 44, 55 и 110, поэтому d(220) = 284. Делители 284 - 1, 2, 4, 71, 142, поэтому d(284) = 220. Подсчитайте сумму всех дружественных чисел меньше 10000. Решение Для начала определим функцию, которая будет возвращать сумму делителей числа: def get_sum(n):     s=0     for i in range(1,n):         if n%i==0:             s+=i     return s Думаю не требует объяснений все довольно тривиально Далее определяем функцию, возвращающую список дружественных чисел до числа n:   def gen_friendlys(n):   ...

Задача 22. Очки за имена

Условие: Используйте   names.txt   (правый клик и 'Save Link/Target As...'), текстовый файл размером 46 КБ, содержащий более пяти тысяч имён. Начните с сортировки в алфавитном порядке. Затем подсчитайте алфавитные значения каждого имени и умножьте это значение на порядковый номер имени в отсортированном списке для получения количества очков имени. Например, если список отсортирован по алфавиту, имя COLIN (алфавитное значение которого 3 + 15 + 12 + 9 + 14 = 53) является 938-ым в списке. Поэтому, имя COLIN получает 938 × 53 = 49714 очков. Какова сумма очков имён в файле? Решение Повторяюсь - я не очень люблю "лингвистические" задачи, но эту постараюсь решить.