Python c[i] = int(n1[i]) + int(n2[i]) + d TypeError: 'reversed' object is not subscriptable
Мне нужно реализовать алгоритм сложения длинных чисел на Python. Тут совсем новичок и не понимаю некоторых особенностей. Я получаю ошибку:
c[i] = int(n1[i]) + int(n2[i]) + d
TypeError: 'reversed' object is not subscriptable
Почему к перевернутой строке нельзя обращаться по индексу? Сам код:
number1 = input('Введите первое длинное число = ')
number2 = input('Введите второе длинное число = ')
l = max(len(number1), len(number2))
n1 = reversed(number1)
n2 = reversed(number2)
d = 0
c = ''
for i in range(0, l, 1):
c[i] = int(n1[i]) + int(n2[i]) + d
if c[i] > 9:
c[i]-=10
d = 1
else:
d = 0
print(reversed(c))
Новый код:
def rev(line):
line = list(line)
l = len(line) - 1
for i in range(0, l // 2, 1):
tmp = line[i]
line[i] = line[l - i]
line[l - i] = tmp
s = ''.join(line)
return s
number1 = input('Введите первое длинное число = ')
number2 = input('Введите второе длинное число = ')
l = max(len(number1), len(number2))
number1 = rev(number1)
number2 = rev(number2)
if len(number2) < l:
while len(number2) != l:
number2+='0'
print(number1)
print(number2)
d = 0
c = ''
for i in range(l):
s = 0
s = int(number1[i]) + int(number2[i]) + d
if s > 9:
s -= 10
d = 1
else:
d = 0
c += str(s) # 3
if d > 0: # 4
c += str(d)
print(c[::-1])
Ответы (1 шт):
reversedне переворачивает строку. Он только возвращает специальный объект с помощью которого символы строки можно перебрать в обратном направлении. Перевернуть строку можно так:number1[::-1].Если строки разной длины будет обращение за пределы короткой строки. Их нужно подравнять.
Строку
cлучше заменить на список. Быстрее будет работать.Забыт последний перенос. Например
50 + 50->00.
Всё остальное работает как нужно:
number1 = input('Введите первое длинное число = ')
number2 = input('Введите второе длинное число = ')
l = max(len(number1), len(number2))
n1 = number1[::-1] + '0' * (l - len(number1)) # 1 и 2
n2 = number2[::-1] + '0' * (l - len(number2))
d = 0
c = [] # 3
for i in range(l):
s = int(n1[i]) + int(n2[i]) + d
if s > 9:
s -= 10
d = 1
else:
d = 0
c.append(s) # 3
if d > 0: # 4
c.append(d)
print(''.join(map(str, reversed(c)))) # 3
P.S. Более питоновский код. Вместо переворота строк они итерируются задом-наперед:
import itertools
number1 = input('Введите первое длинное число = ')
number2 = input('Введите второе длинное число = ')
carry = 0
c = []
for d1, d2 in itertools.zip_longest(
reversed(number1),
reversed(number2),
fillvalue='0'
):
carry, d = divmod(int(d1) + int(d2) + carry, 10)
c.append(d)
if carry > 0:
c.append(carry)
print(''.join(map(str, reversed(c))))