Как напрограммировать классическое школьное деление столбиком?

Пришла в голову совершенно дурная идея.

Чисто в рамках самоповышения квалификации, попробовать напрограммировать классическое школьное деление в столбик. По типу вот такого (случайная картинка из интернетов): классическое школьное деление в столбик Т.е. как это должно выглядеть, на примере примера:

  1. Мой гуи отображает поля там где 322, 7 и 28, в них я могу ввести числа.
  2. Я нажимаю кнопку, переход к остатку, и результат деления, вписывает результат первый под 7ку.
  3. Повторение шагов 1 и 2 с полями 42 и 42.
  4. Повторение пока не 0.

Собственно, хотя бы примерно какой гуи под это дело взять? Какие библиотеки для отрисовки и мб счета? Есть что то что способно выдать именно промежуточные результаты по типу остатка и одной цифры из числа ответа? Ну, и как бы это дело отрисовывать в том случае, если ступеней будет не 2, а, к примеру, 15?

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


Ответы (2 шт):

Автор решения: Lecron

Задача любопытная. Про отрисовку не скажу, но счет довольно прост. Реализовал для целых (ваш пример), но не проблема добавить десятичную дробь.

dividend = 322
divider = 7

digits = []
while dividend > 0:
    digits.append(dividend % 10)
    dividend //= 10
dividend = digits[::-1]

rest = 0
for d in dividend:
    d += rest * 10
    whole = d // divider
    if whole:
        step = (whole * divider, whole)
        rest = d % divider
        print(d, step, rest)
    else:
        rest = d

# 32 (28, 4) 4
# 42 (42, 6) 0
→ Ссылка
Автор решения: GrAnd

С отрисовкой псевдографикой:

num = 1234567890
div = 321

digits = list(map(int, str(num)))

print(f"  {num} │ {div}")
print("-", " "*len(digits), "├─" + "─"*max(len(str(div)), len(str(num // div))))
print(" "*len(digits), "  │", num // div, end="\r")

rem = offset = 0
while digits:
    rem = rem*10 + digits.pop(0)
    if rem >= div:
        if offset:
            print(f"{'':<{offset}}  {rem}")
            print(f"{'':<{offset}}-")
        l = len(str(rem))
        res, rem = divmod(rem, div)
        print(f"{'':<{offset}}  {res*div:>{l}}")
        print(f"{'':<{offset}}──", "─"*l, sep="")
        offset += l - len(str(rem)) + (0 if rem else 1)
print(f"{'':<{offset}}  {rem}")

Выглядит вот так:

  1234567890 │ 321
-            ├────────
   963       │ 3846005
──────
   2715
 -
   2568
 ──────
    1476
  -
    1284
  ──────
     1927
   -
     1926
   ──────
        1890
      -
        1605
      ──────
         285
→ Ссылка