Как напрограммировать классическое школьное деление столбиком?
Пришла в голову совершенно дурная идея.
Чисто в рамках самоповышения квалификации, попробовать напрограммировать классическое школьное деление в столбик. По типу вот такого (случайная картинка из интернетов):
Т.е. как это должно выглядеть, на примере примера:
- Мой гуи отображает поля там где 322, 7 и 28, в них я могу ввести числа.
- Я нажимаю кнопку, переход к остатку, и результат деления, вписывает результат первый под 7ку.
- Повторение шагов 1 и 2 с полями 42 и 42.
- Повторение пока не 0.
Собственно, хотя бы примерно какой гуи под это дело взять? Какие библиотеки для отрисовки и мб счета? Есть что то что способно выдать именно промежуточные результаты по типу остатка и одной цифры из числа ответа? Ну, и как бы это дело отрисовывать в том случае, если ступеней будет не 2, а, к примеру, 15?
Докину сверху, что хотелось бы как бы красивенько через гуи, а не через псевдографику консоли. Типа 2 блока гуя, сверху маленький, с первоначальным вводом, ниже побольше, который будет подкручиваться и содержать в себе вообще весь процесс.
Ответы (2 шт):
Задача любопытная. Про отрисовку не скажу, но счет довольно прост. Реализовал для целых (ваш пример), но не проблема добавить десятичную дробь.
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
С отрисовкой псевдографикой:
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