Существует ли библиотека Python, которая делит число столбиком и выводит историю деления?
Допустим, вводим 123/5. Тогда на выходе получим:
123|5
10 |24
23
3
Написал код под первые две строки, а дальше не понимаю как отступы отмерять и складывать разные разряды (ведь надо, чтобы все работало с любыми числами). Вот и спрашиваю, что может быть есть какая-то библиотека, которая это делает?
Ответы (2 шт):
Можно сделать так:
def division(numerator, divisor):
numerator = str(numerator)
M = len(numerator)
divisor = int(divisor)
res = numerator + ' | ' + str(divisor) + '\n'
if int(numerator) < int(divisor):
return res + '0' + ' '*M + '| 0'
div_res = ''
i = 0
while True:
num = 0
idx = 0
while num < divisor:
idx += 1
num = int(numerator[:idx])
if idx > len(numerator):
res = res.split('\n')
res[1] += ' '*(M-len(res[1])+1) + '| ' + div_res
return '\n'.join(res)
d, m = divmod(num, divisor)
div_res += str(d)
if m == 0:
div_res += '0'
deduct = divisor*d
num_ = str(num-deduct)
if num_ == '0':
num_ = ''
numerator = num_ + numerator[idx:]
res += ' '*i + str(deduct) + '\n' + ' '*((i+1) if num_ !='' else (M-1)) + numerator + '\n'
i += 1
Если вы в настроении симулировать деление столбиком, то вот этот ответ. "Симулировать" потому что на деле деление делается в машинной арифметике, после чего восстанавливается запись деления столбиком.
Метод lines порождает числа которые последовательно вычитаются из делимого, как в обычном делении в столбик. Числа правильно выравнены по правому краю. Нули пропускаются. Последним печатается остаток от деления.
def show_division(n, m):
assert n >= 0
assert m > 0
ns = str(n)
print('{}|{}'.format(ns, m))
digits = str(n // m)
def lines():
for i, d in enumerate(digits):
if d != '0':
yield '{}{}'.format(str(int(d) * m), ' ' * (len(digits) - i - 1))
yield str(n % m)
for i, line in enumerate(lines()):
line = line.rjust(len(ns))
if i == 0:
print('{}|{}'.format(line, digits))
else:
print(line)
print()
show_division(123, 5)
show_division(123, 6)
show_division(12345, 25)
show_division(1234, 1423)
show_division(83532, 3)
$ python school_division_simulation.py 123|5 10 |24 20 3 123|6 12 |20 3 12345|25 100 |493 225 75 20 1234|1423 1234|0 83532|3 6 |27844 21 24 12 12 0