Высота дроби, оптимизация кода
Высота обыкновенной дроби — это сумма модуля числителя и знаменателя этой дроби. Высота рационального числа — это сумма модуля числителя и знаменателя несократимой обыкновенной дроби, соответствующей этому числу. Надо написать программу, которая напечатает все рациональные числа высотой n (её значение введёт пользователь), лежащие между 0 и 1.
Вот один из вариантов такой программы:
def gcd(a, b):
"""Функция нахождения наибольшего общего делителя"""
while b:
a, b = b, a % b
return a
# Запрашиваем у пользователя высоту
height = int(input("Введите высоту рациональных чисел: "))
# Перебираем все возможные значения числителей
for numerator in range(1, height):
denominator = height - numerator
# Проверяем, что дробь несократимая
if gcd(numerator, denominator) != 1:
continue
# Проверяем, что дробь лежит между 0 и 1
if numerator/denominator > 1 or numerator/denominator < 0:
continue
# Если все условия выполнены, печатаем дробь
print(f"{numerator}/{denominator}")
Помогите, пожалуйста, этот код оптимизировать. Например, в данном варианте на каждом шаге цикла производится проверка несократимости дроби, а также проверка на возлежание дроби между 0 и 1. Может, можно как-то уменьшить количество таких проверок?
P. S.
Девятилетняя ученица одной из моих знакомых вообще использовала два цикла вместо одного, но в её возрасте такое простительно:
def gcd(a, b):
"""Функция нахождения наибольшего общего делителя"""
while b:
a, b = b, a % b
return a
# Запрашиваем у пользователя высоту
height = int(input("Введите высоту рациональных чисел: "))
# Перебираем все возможные пары числителей и знаменателей
for numerator in range(1, height+1):
for denominator in range(1, height+1):
# Проверяем, что числитель и знаменатель не равны высоте
if numerator + denominator != height:
continue
# Проверяем, что дробь несократимая
if gcd(numerator, denominator) != 1:
continue
# Проверяем, что дробь лежит между 0 и 1
if numerator/denominator > 1 or numerator/denominator < 0:
continue
# Если все условия выполнены, печатаем дробь
print(f"{numerator}/{denominator}")