Задать вопрос
@Azaliya89

Как написать программу в Python, позволяющую записать обыкновенную дробь в виде конечной простой непрерывной дроби?

Я недавно начала изучать Python. На одном из онлайн-курсов мне попалась следующая задача(см.картинку)

5c9cbafcae196479117077.png

Собственно само разложение дроби достаточно подробно и понятно описано в Википедии (https://ru.wikipedia.org/wiki/Непрерывная_дробь)

Я написала следующую программу:
n=input().split('/')
a=int(n[0])//int(n[1])
b=(int(n[0])/int(n[1]))-a
s=[]
k=0
while b!=0:
      s.append(a)
      a=1//b
      k=1/b-int(a)
      b=k
print(*s)


При попытке проверить пример из задания, искомые коэффициенты (7,1,29) выводятся правильно, однако цикл становится бесконечным и почему-то не останавливается, несмотря на то, что в определенный момент b становится равным нулю. Я, если честно, сломала всю голову в попытке понять, почему так происходит.. может, кто-нибудь мне сможет объяснить, что я упускаю?

Еще я написала программу с использованием функции divmod, однако в ней, аналогично, несмотря на равенство b нулю, цикл продолжается( и в списке коэффициентов вместо 29 получается 30..

В общем, буду очень благодарна, если кто-то поможет советом начинающему)
  • Вопрос задан
  • 4977 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
tsarevfs
@tsarevfs
C++ developer
Не используйте float деление. Храните пару (числитель, знаменатель) для того чтобы представить значение "хвоста". В итоге можно обойтись только целочисленным делением и взятием остатка.

num, den = (int(v) for v in input().split('/'))
a, q = divmod(num, den)
t = den #q/t -- хвост
res = [a]
while q != 0:
    next_t = q
    a, q = divmod(t, q)
    t = next_t
    res.append(a)
print(res)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
SpectrumData Екатеринбург
от 200 000 до 300 000 ₽
Greenway Global Новосибирск
от 150 000 ₽
Akronix Санкт-Петербург
от 150 000 до 200 000 ₽
19 янв. 2025, в 14:08
2000 руб./за проект
19 янв. 2025, в 13:33
700000 руб./за проект