Программа курса:
Разбор задачи: Добавление строк
Предложенный нами код решения:
def add_strings(num1, num2):
"""
:param num1: строка, представляющая неотрицательное целое число
:param num2: строка, представляющая неотрицательное целое число
:return: строка, представляющая сумму num1 и num2
"""
# Инициализация переменных
result = []
carry = 0
i, j = len(num1) - 1, len(num2) - 1
# Цикл по обеим строкам начиная с конца
while i >= 0 or j >= 0 or carry:
digit1 = int(num1[i]) if i >= 0 else 0
digit2 = int(num2[j]) if j >= 0 else 0
total = digit1 + digit2 + carry
# Определяем новое значение для carry и цифры для результата
carry = total // 10
result.append(str(total % 10))
# Двигаемся по строкам
i -= 1
j -= 1
return ''.join(result[::-1])
Решение задачи заключается в том, чтобы сложить два числа, представленных в виде строк. Алгоритм реализует сложение чисел по аналогии с тем, как это происходит в столбик, начиная с самых младших разрядов.
Пошаговый разбор решения:
- Инициализация переменных:
result: Список, в котором будут храниться цифры суммы, начиная с младшего разряда.carry: Переменная для хранения переноса между разрядами. Изначально равна 0.i, j: Индексы для строкnum1иnum2, которые начинаются с последнего символа строк. Мы будем идти по строкам с конца, как это делается при сложении столбиком.
- Основной цикл: Цикл будет выполняться до тех пор, пока:
- Не обработаны все цифры из обеих строк (
i >= 0 or j >= 0). - Или существует перенос, который нужно учесть (
carry).
- Не обработаны все цифры из обеих строк (
- Цифры для сложения: Внутри цикла для каждой пары цифр (из
num1иnum2):- Если индекс строки
num1(илиnum2) в пределах допустимого, то извлекаем цифру на этом индексе. Если индекс выходит за пределы строки (например, мы достигли конца строки), то используем 0. - Суммируем эти цифры с учетом переноса (если он был).
- Если индекс строки
- Рассчитываем новый перенос и цифры:
- Получаем новый перенос:
carry = total // 10, гдеtotal— это сумма двух цифр и возможного переноса. - Получаем цифру для текущего разряда:
total % 10. Это остаток от деления на 10, который и будет цифрой, добавленной в результат.
- Получаем новый перенос:
- Добавление результата: Добавляем цифру (результат текущей операции) в список
result. Мы добавляем цифры начиная с младших разрядов, поэтому они добавляются в конец списка. - Переход к следующей цифре: Уменьшаем индексы
iиj, чтобы двигаться по строкам к более старшим разрядам. - Возвращаем результат: После завершения цикла, результат находится в списке
resultв обратном порядке (самый младший разряд в начале). Поэтому возвращаем строку, объединяя элементы списка в обратном порядке:''.join(result[::-1]).
Пример:
- Пусть
num1 = "456",num2 = "77". - Инициализируем
result = [],carry = 0,i = 2,j = 1.- Итерация 1 (i=2, j=1):
digit1 = 6,digit2 = 7.- Сумма:
6 + 7 + 0 = 13. - Перенос:
carry = 13 // 10 = 1. - Текущая цифра:
13 % 10 = 3. - Добавляем "3" в
result.
- Итерация 2 (i=1, j=0):
digit1 = 5,digit2 = 7.- Сумма:
5 + 7 + 1 = 13. - Перенос:
carry = 13 // 10 = 1. - Текущая цифра:
13 % 10 = 3. - Добавляем "3" в
result.
- Итерация 3 (i=0, j=-1):
digit1 = 4,digit2 = 0(так как j=-1, берем 0).- Сумма:
4 + 0 + 1 = 5. - Перенос:
carry = 5 // 10 = 0. - Текущая цифра:
5 % 10 = 5. - Добавляем "5" в
result.
- Цикл завершен, результат:
result = ["3", "3", "5"].
- Итерация 1 (i=2, j=1):
- Строка из
result:"533".
xsnm
,встроенных функций
int ??????
Filaret
,А зачем так сложно? Решение никак не обойдется без функции int (надо же как-то преобразовывать строку в число!), а если так, то что мешает написать буквально в одну строку?
admin
,Filaret, Исправил эту глупость. Спасибо что заметили.