Как найти сумму трех чисел в python

Давайте рассмотрим довольно классическую задачку на программирование под названием «Сумма трех чисел» (и производную от нее — «Сумму четырех чисел»). Решать будем брутфорс-методом, а затем усовершенствуем решение при помощи рекурсии так, чтобы оно подходило для любой задачи «Сумма K чисел». Вы увидите, что хотя брутфорс-решение не очень хорошо масштабируется, оно все равно не бесполезно.

Три воздушных шара

Давайте начнем с простого варианта задачи — суммы трех чисел. Вот условие:

# Дан массив nums, содержащий n целых чисел, 
# и дано целевое число - target.
# Напишите функцию, которая будет определять, 
# есть ли в nums три элемента a, b и c, 
# сумма которых равна целевому числу
# (т. е. a + b + c = target).

# Пример:

# Input:
# nums = [-1,0,1,2,-1,-4]
# target = 0

# Output: [[-1,-1,2],[-1,0,1]]

# Обратите внимание, что в выводе программы
# не должно быть повторяющихся троек.

Нам дается список чисел, в котором нужно найти три числа, в сумме дающих нуль (или любое другое указанное число). Как бы вы это решили?

1. Подход

Брутфорс-решение будет построено на итерациях. Представьте, что мы берем каждое число и сопоставляем его со всеми остальными числами, а затем сопоставляем каждую пару со всем другими числами. На что это похоже? Правильно, на вложенные циклы for. Вероятно, где-то здесь можно применить рекурсию. Если видите способ — поделитесь в комментариях!

Но есть одна заковыка: в выводе не должно быть дубликатов троек. Как нам это учесть? Вероятно, вы подумали об использовании множеств, и — да, именно их мы и используем. Мы превратим каждую найденную тройку в строку и поместим во множество, таким образом гарантируя отсутствие повторов.

2. Подготовка

Наш метод sum_of_three будет принимать два аргумента: список nums и число-сумму — target.

def sum_of_three(nums, target):

Далее нам нужно учесть крайний случай. Что, если в nums будет меньше 3 чисел? Тогда мы точно не сможем найти тройку чисел, дающих в сумме target. В этом случае мы вернем пустой список.

def sum_of_three(nums, target):
    if len(nums) < 3:
        return []

Теперь нам нужно инициализировать пару переменных, которые мы будем использовать. Во-первых, список output, в котором будут содержаться списки с найденными тройками чисел. Также мы создадим один из этих списков троек и назовем его current. Как только мы заполним current подходящей тройкой чисел, мы сможем добавить его в output.

output = []
current = []

И, как мы и говорили, нам нужно создать множество. Кроме того нам нужно будет сортировать списки чисел, чтобы не включить в множество один набор дважды. А такое может быть, если числа будут идти в разном порядке. Например, если у нас есть [1, -2, 1] и [1, 1, 2], нам нужно добавить во множество только какой-то один из этих списков.

checked = set()
nums.sort()

3. Итерации

Итак, мы готовы к созданию циклов for. Всего нам нужно будет сделать три таких цикла. При этом самый важный момент — продумывание верхних и нижних границ для индексов.

В первом цикле мы начинаем с первого числа в списке и доходим до третьего с конца. Почему? Нам нужны два дополнительных числа, с которыми мы будем сопоставлять число в цикле, а когда мы дойдем до предпоследнего, у нас просто не останется достаточного количества чисел, чтобы составить из них тройку.

for i in range(len(nums) - 2):

В качестве напоминания: функция range() принимает два аргумента. Синтаксис:

range(start, stop, step)

Первые два аргумента задают диапазон, причем первый (start) включается в него, а второй (end) — не включается. Третий аргумент (step) опционален и задает шаг. Если он не указан, то по умолчанию шаг равен 1.

Но первый аргумент тоже опционален. Если его не указывать, по умолчанию стартовая позиция — 0.

Итак, что мы будем делать в нашем первом цикле for? План следующий:

  1. Добавить первое число в current.
  2. Вычесть это число из суммы.
  3. Сверить с другими числами.
  4. «Откатить» шаги 1 и 2, вернувшись в исходное положение, чтобы перейти к следующему числу.

Давайте реализуем это в коде. Первый шаг простой, мы лишь добавляем число под индексом i в current при помощи метода append.

current.append(nums[i])

Следующий шаг тоже довольно элементарный. Причем мы можем просто уменьшать target на текущее число (т. е. target -= nums[i]), но для лучшей читаемости давайте создадим новую переменную — working_target.

working_target = target - nums[i]

Третий шаг уже сложнее. Под «Сверить с другими числами» следует понимать вложенные циклы for, которыми мы займемся далее. Пока мы это просто закомментируем.

Четвертый шаг тоже простой. Мы удаляем последний элемент из current при помощи current.pop() и возвращаем target в исходный вид. Впрочем, здесь нам не придется ничего делать с target, потому что мы создали отдельную переменную. Наш цикл будет выглядеть так:

for i in range(len(nums) - 2):
    current.append(nums[i])
    working_target = target - nums[i]
    # сделать вложенные циклы for
    current.pop()

Отлично, теперь переходим ко второму, вложенному циклу.

Каков будет наш диапазон индексов? Мы начинаем с индекса, идущего следом за i, и доходим до предпоследней позиции в nums.

for j in range(i + 1, len(nums) - 1):

И повторяем шаги 1-4 из первого цикла. То есть мы добавляем число под индексом j в current, уменьшаем working_target на это число, оставляем место для третьего цикла, а затем откатываем назад шаги 1 и 2.

for j in range(i _ 1, len(nums) - 1):
    working_target -= nums[j]
    current.append(nums[j])
    # сделать вложенный цикл for
    current.pop()
    working_target +=nums[j]

Наконец, давайте напишем самый внутренний цикл. С индексами уже должно быть понятно. Мы начинаем с j + 1 и идем до конца.

for k in range(j + 1, len(nums)):

Число под индексом k мы добавляем в current — тут никаких проблем нет. Но при вычитании k из working_target нам нужно проверить, равна ли разница нулю. Если все три числа в сумме дают target, то target - a - b - c = 0.

for k in range(j + 1, len(nums)):
    current.append(nums[k])
    if working_target - nums[k]  == 0:

Что у нас будет в блоке if? Пришла пора применить наше множество и проверить, нет ли в нем уже такой тройки чисел.

Мы не можем поместить списки во множество, так что нам нужно преобразовать нашу тройку чисел в строку. Следующий код создаст строку, в которой между числами будут проставлены знаки &. Например, [1, 1, -2] превратится в 1&1&-2. Для разделения чисел можно использовать любой символ, но он нужен обязательно — чтобы не спутать 1, 11 с 11, 1.

# добавление тройки чисел во множество для исключения дубликатов
code = str(current[0])
for n in range(1, len(current)):
    code += "&" + str(current[n])

Теперь мы можем проверить, есть ли code во множестве. Если его там нет, мы можем добавить его во множество и добавить current в наш итоговый output. Не забудьте, что добавить нужно копию current, а не просто ссылку. В противном случае тройка может измениться после добавления в output!

if code not in checked:
    output.append(current.copy())
    checked.add(code)

Наконец, мы удаляем третье число из current. В итоге третий цикл for выглядит следующим образом:

for k in range(j + 1, len(nums)):
    current.append(nums[k])
    if working_target - nums[k] == 0:
        # добавление тройки чисел во множество для исключения дубликатов
        code = str(current[0])
        for n in range(1, len(current)):
            code += "&" + str(current[n])
        if code not in checked:
            output.append(current.copy())
            checked.add(code)
    current.pop()

4. Заканчиваем работать над задачей «Сумма трех чисел»

Все, что нам остается, это вернуть список output. Наш метод в итоге выглядит так (следите внимательно за отступами во всех этих циклах for!):

def sum_of_three(nums, target):
    if len(nums) < 3:
        return []
    output = []
    current = []
    checked = set()
    nums.sort()

    for i in range(len(nums) - 2):
        current.append(nums[i])
        working_target = target - nums[i]
        for j in range(i + 1, len(nums) - 1):
            working_target -= nums[j]
            current.append(nums[j])
            for k in range(j + 1, len(nums)):
                current.append(nums[k])
                if working_target - nums[k] == 0:
                # добавление тройки чисел во множество для исключения дубликатов
                    code = str(current[0])
                    for n in range(1, len(current)):
                        code += "&" + str(current[n])
                    if code not in checked:
                        output.append(current.copy())
                        checked.add(code)
                current.pop()
            current.pop()
            working_target += nums[j]
        current.pop()
        working_target += nums[i]
    return output

Маленький пример для тестирования метода:

nums = [-1,0,1,2,-1,-4]
target = 0
print(sum_of_three(nums, target))

Мы получим в итоговом output [[-1,-1,2],[-1,0,1]]. Обратите внимание, что у нас нет дубликатов троек, хотя во втором списке тоже есть две -1.

5. Наращиваем сложность: сумма четырех чисел

Четыре воздушных шара

Теперь, когда вы счастливо перевели дух, покончив с суммой трех чисел, как насчет суммы четырех?

Хотя кажется, что эта задача сложнее, по сути, мы можем использовать все тот же брутфорс-метод. Я знаю, что временная сложность и так была ужасной — O(N3), а теперь станет еще хуже — O(N4). Но, как говорится, «зато работает».

Как мы подойдем к решению? Мы можем просто немного изменить код нашего метода sum_of_three, добавив еще один цикл. Каждый цикл начинается с предыдущего индекса, увеличенного на единицу, и заканчивается на единицу ближе к концу списка. Вот как это выглядит:

for i in range(len(nums) - 3):
    for j in range(i + 1, len(nums) - 2):
        for k in range(j + 1, len(nums) - 1):
            for m in range(k + 1, len(nums)):

В каждом цикле мы проходим одинаковые шаги: добавляем число в current, вычитаем его из target, что-то проверяем, а затем откатываем назад предыдущие действия. Чтобы вам не пришлось лишний раз скроллить, вот вам наш готовый метод:

def sum_of_four(nums, target):
    if len(nums) < 4:
        return []
    output = []
    current = []
    nums.sort()
    checked = set()
    for i in range(len(nums) - 3):
        working_target = target - nums[i]
        current.append(nums[i])
        for j in range(i + 1, len(nums) - 2):
            working_target -= nums[j]
            current.append(nums[j])
            for k in range(j + 1, len(nums) - 1):
                working_target -= nums[k]
                current.append(nums[k])
                for m in range(k + 1, len(nums)):
                    current.append(nums[m])
                    if working_target - nums[m] == 0:
                        # добавление чисел во множество для исключения дубликатов
                        code = str(current[0])
                        for n in range(1, len(current)):
                            code += "&" + str(current[n])
                        if code not in checked:
                            output.append(current.copy())
                            checked.add(code)
                    current.pop()
                current.pop()
                working_target += nums[k]
            current.pop()
            working_target += nums[j]
        current.pop()
    return output

Он точно такой же, как для «Суммы трех чисел», только с дополнительным циклом. Мы можем проверить его работу:

nums = [1,0,-1,0,-2,2, 0]
target = 0
print(sum_of_four(nums, target))

В результате получим [[-2, -1, 1, 2], [-2, 0, 0, 2], [-1, 0, 0, 1]]. Работает!

6. Сумма пяти чисел и так далее

Множество воздушных шаров

Вы написали метод для суммы трех чисел и для суммы четырех, и уже должны чувствовать себя достаточно уверенно. А что, если попросить вас теперь решить задачку с суммой пяти чисел?

Да никаких проблем! Просто добавим еще один цикл for. Но сейчас вы можете заметить, что вырисовывается паттерн:

for j in range(i + 1, len(nums) - 2):
    working_target -= nums[j]
    current.append(nums[j])
    for k in range(j + 1, len(nums) - 1):
        working_target -= nums[k]
        current.append(nums[k])
        for m in range(k + 1, len(nums)):
            current.append(nums[m])

А когда у нас есть повторяющийся код, хороший тон — написать для него отдельный метод. Почему бы нам не написать рекурсивный метод для запуска каждого цикла for? Тогда мы сможем просто указывать ему, сколько чисел мы хотим суммировать, а он сам определит, сколько вложенных циклов сделать.

Итак, давайте сделаем такой же метод, как раньше, только теперь он будет принимать еще и аргумент k — количество чисел, сумма которых должна быть равна target (три, четыре, пять и т. д. чисел).

def sum_of_k(nums, target, k):
    if len(nums) < k:
        return []
    output = []
    current = []
    nums.sort()
    checked = set()

А теперь мы создадим рекурсивный метод sum_helper(), который будет принимать… да практически все переменные, созданные нам ранее. Кроме того, нам нужно знать предыдущий индекс, стартующий с 0 (чтобы начинать цикл с позиции i + 1). Этот метод будет изменять массивы, поэтому нам нужно вызвать его, а затем вернуть output.

sum_helper(nums, target, k, output, checked, current, 0)
return output

7. Итерация с рекурсивным методом

Давайте подумаем, как нам создать наш рекурсивный вспомогательный метод. Мы каждый раз будем вычитать из k. В конечном итоге, «сумма четырех» — это просто «сумма трех» с дополнительным числом.

Нашему рекурсивному методы нужен базовый случай. Если k равна 0, нам не нужно ничего делать. В этом случае мы просто выходим из функции (return).

if k == 0:
    return

Если k > 0, нам нужно перебрать в цикле nums. Мы начинаем с индекса prev и идем до «конец списка - k + 1» (к этому мы пришли, рассматривая паттерн в предыдущем решении).

for i in range(prev, len(nums) - k + 1):

Что дальше? Смотрим на наш список: мы добавляем текущее число в current.

current.append(nums[i])

Возможно, вы думаете, что следующий шаг — вычесть это число из target, но сначала нам нужно кое-что проверить. Этот цикл for должен быть универсальным для каждой итерации k, так что мы должны учесть и случай, если данный цикл — самый вложенный.

То есть нам нужно проверить, дает ли нуль вычитание числа из target. Затем мы делаем то же, что и раньше (можете скопировать с минимальными правками) — добавляем code в виде строки во множество и, если значение уникально, добавляем копию current в output.

if k == 1 and target - nums[i] == 0:
    # добавление чисел во множество для исключения дубликатов
    code = str(current[0])
    for n in range(1, len(current)):
        code += "&" + str(current[n])
    if code not in checked:
        output.append(current.copy())
        checked.add(code)

Теперь нам нужно вычесть число из рабочей target и написать наш рекурсивный случай. Но погодите, мы же можем сделать это за один шаг! Вот рекурсивный вызов:

sum_helper(nums, target - nums[i], k - 1, output, checked, current, i + 1)

Здесь у нас меняется target, k уменьшается на 1, а текущий индекс + 1 становится предыдущим индексом prev.

Наконец, нам нужно откатить назад добавление числа в current:

current.pop()

Вот и все! Вместе наши методы выглядят следующим образом:

def sum_of_k(nums, target, k):
    if len(nums) < k:
        return []
    output = []
    current = []
    nums.sort()
    checked = set()
    sum_helper(nums, target, k, output, checked, current, 0)
    return output

def sum_helper(nums, target, k, output, checked, current, prev):
    if k == 0:
        return
    for i in range(prev, len(nums) - k + 1):
        current.append(nums[i])
        if k == 1 and target - nums[i] == 0:
            # добавление чисел во множество для исключения дубликатов
            code = str(current[0])
            for n in range(1, len(current)):
                code += "&" + str(current[n])
            if code not in checked:
                output.append(current.copy())
                checked.add(code)
        sum_helper(nums, target - nums[i], k - 1, output, checked, current, i + 1)
        current.pop()

Наш метод по-прежнему очень громоздкий, но нам хотя бы не приходится изменять его вручную при каждом изменении k. Следующий код будет работать независимо от того, равна k 3, 4 или другим числам!

nums = [-1,0,1,2,-1,-4, -2]
target = 0
k = 4
print(sum_of_k(nums, target, k))
# -> [[-2, -1, 1, 2], [-1, -1, 0, 2]]

Не стоит забывать, что это — брутфорс-решение. Его временная сложность — O(Nk), а это очень плохо, если k оказывается большим числом. Вероятно, эту задачу можно решить более элегантно. Если вы знаете, как, — добро пожаловать в комментарии!

import itertools

def solve(nums, k):

  if len(nums)<=2:

    return False

  else:

    permut = itertools.combinations(nums, 3)

    max_value = max(nums)

    if max_value*3 < k:

      return False

    else:

      for i in permut:

        if i[0]+i[1]+i[2]==k:

          return True

        return False

nums = [4,1,3,1]

k=5

print("Test case :-nk=",k," nnums = ",nums)

print("-----------------------------------------")

Solution.solve(nums, k)

print("-----------------------------------------")

nums = [2, 4, 3, 0, 1]

k = 0

print("Test case :-nk=",k," nnums = ",nums)

print("-----------------------------------------")

Solution.solve(nums, k)

print("-----------------------------------------")

nums = [0]

k = 0

print("Test case :-nk=",k," nnums = ",nums)

print("-----------------------------------------")

Solution.solve(nums, k)

print("-----------------------------------------")

nums = [1, 0]

k = 1

print("Test case :-nk=",k," nnums = ",nums)

print("-----------------------------------------")

Solution.solve(nums, k)

print("-----------------------------------------")

nums = [2, 0, 1]

k = 3

print("Test case :-nk=",k," nnums = ",nums)

print("-----------------------------------------")

Solution.solve(nums, k)

print("-----------------------------------------")

nums = [13, 76, 35, 89, 15, 76, 54, 4, 66, 4,

        9, 25, 9, 48, 26, 76, 95, 80, 19, 66,

        74, 15, 18, 96, 36, 78, 80, 42, 42, 76,

        85, 74, 96, 9, 95, 29, 58, 43, 57, 14,

        38, 21, 55, 56, 18, 25, 3, 11, 76, 77,

        72, 36, 44, 88, 93, 2, 95, 86, 77, 47,

        3, 51, 34, 46, 70, 90, 4, 24, 58, 6, 91,

        93, 59, 69, 89, 5, 58, 87, 23, 15, 98, 24,

        62, 64, 15, 43, 93, 68, 17, 4, 78, 6, 2,

        10, 52, 17, 28, 82, 20, 44, 78, 91, 1, 79,

        17, 23, 27, 66, 88, 57, 60, 78, 68, 6,

        35, 43, 73, 37, 12, 22, 47, 59, 40, 36,

        0, 70, 91, 68, 33, 54, 44, 78, 23, 69, 60,

        44, 32, 15, 20, 28, 36, 55, 73, 12, 55, 26,

        43, 57, 63, 46, 0, 43, 24, 91, 86, 61, 15,

        10, 29, 8, 51, 84, 94, 18, 5, 63, 90, 4,

        38, 28, 84, 67, 18, 33, 85, 93, 31, 38,

        97, 14, 79, 11, 92, 3, 8, 27, 65, 39, 1,

        83, 38, 8, 83, 53, 53, 44, 57, 64, 78, 1,

        44, 72, 100, 86, 85, 16, 5, 27, 24, 2, 56,

        74, 16, 90, 65, 8, 93, 64, 72, 45, 47, 7,

        83, 100, 99, 62, 89, 38, 38, 42, 98, 18,

        29, 88, 48, 35, 0, 82, 56, 22, 64, 13, 54,

        66, 32, 9, 2, 52, 80, 28, 19, 9, 38, 98, 38,

        21, 41, 65, 78, 63, 97, 71, 99, 41, 89, 78,

        48, 47, 72, 67, 79, 45, 43, 92, 30, 28, 42,

        52, 56, 24, 46, 55, 82, 22, 86, 67, 43, 84,

        41, 26, 66, 26, 32, 8, 93, 65, 10, 47, 19,

        70, 84, 43, 99, 74, 78, 51, 59, 58, 38, 75,

        86, 24, 48, 27, 72, 32, 15, 28, 98, 11, 70,

        74, 91, 89, 90, 74, 69, 60, 78, 6, 67, 34,

        100, 70, 98, 70, 60, 12, 58, 26, 21, 44, 64,

        15, 82, 81, 52, 9, 82, 94, 99, 43, 22, 14,

        16, 27, 68, 72, 69, 45, 60, 10, 91, 31, 58, 91,

        71, 42, 19, 43, 42, 80, 61, 50, 2, 81, 45, 40,

        44, 100, 68, 74, 19, 0, 33, 24, 58, 59, 1, 26,

        65, 69, 19, 60, 12, 50, 82, 44, 18, 96, 77, 43,

        33, 31, 53, 9, 36, 86, 24, 46, 11, 26, 3, 43, 8,

        42, 17, 55, 60, 56, 33, 66, 90, 64, 42, 73,

        61, 34, 13, 43, 9, 59, 46, 0, 68, 93, 60, 78,

        92, 76, 45, 20, 31, 47, 21, 44, 2, 23, 78, 72,

        62, 65, 56, 26, 80, 65, 87, 61, 88, 22, 38, 70,

        98, 48, 25, 95, 55, 3, 32, 28, 50, 13, 57, 18,

        95, 11, 23, 57, 21, 93, 35, 38, 75, 79, 39, 87,

        30, 95, 73, 37, 47, 43, 15, 73, 59, 0, 29, 29,

        30, 50, 13, 73, 1, 32, 7, 46, 7, 24, 43, 21, 84,

        1, 6, 96, 33, 69, 2, 70, 98, 2, 90, 31, 66, 74, 58, 66, 56, 33,

        5, 78, 19, 21, 98, 76, 1, 55, 97, 39, 43, 43, 44, 7, 61, 84, 31,

        0, 67, 46, 39, 23, 7, 31, 29, 2, 71, 7, 35, 60, 20, 94, 23, 81,

        40, 79, 11, 46, 71, 25, 42, 54, 10, 21, 11, 72, 86, 48, 53, 67,

        36, 55, 49, 98, 65, 37, 27, 63, 20, 86, 60, 29, 63, 75, 91, 30,

        55, 23, 82, 88, 53, 62, 44, 25, 27, 99, 39, 4, 40, 41, 35, 35, 61,

        62, 10, 98, 9, 82, 21, 39, 82, 89, 41, 71, 26, 51, 2, 73, 30, 49,

        92, 16, 66, 60, 68, 2, 99, 91, 15, 77, 43, 44, 46, 69, 79, 100, 47,

        9, 66, 33, 25, 15, 5, 77, 86, 81, 82, 69, 10, 0, 98, 4, 90, 30, 89,

        87, 83, 97, 35, 96, 71, 15, 50, 12, 82, 79, 91, 79, 28, 62, 24, 75,

        77, 68, 59, 87, 29, 81, 66, 92, 85, 4, 17, 48, 69, 28, 37, 55, 39,

        11, 92, 57, 26, 64, 91, 44, 37, 3, 44, 57, 13, 75, 21, 39, 17, 29,

        18, 74, 43, 93, 53, 6, 61, 71, 89, 99, 13, 92, 23, 99, 18, 13, 38,

        14, 9, 82, 10, 7, 41, 24, 40, 61, 42, 26, 2, 43, 38, 3, 50, 43, 75,

        47, 95, 16, 41, 40, 43, 14, 26, 40, 79, 11, 30, 16, 39, 46, 45, 25,

        44, 79, 21, 48, 48, 23, 38, 79, 62, 71, 8, 53, 12, 72, 64, 71, 50,

        90, 38, 77, 6, 48, 74, 77, 53, 85, 82, 19, 18, 43, 97, 67, 56, 25,

        46, 87, 27, 99, 21, 13, 56, 71, 87, 73, 25, 0, 52, 82, 18, 65, 34,

        96, 33, 99, 43, 45, 2, 59, 29, 53, 34, 78, 27, 41, 74, 74, 59, 96,

        74, 45, 74, 44, 28, 62, 4, 90, 62, 31, 89, 72, 88, 69, 5, 29, 26,

        81, 66, 96, 53, 87, 72, 89, 9, 30, 71, 75, 83, 46, 71, 57, 12, 77,

        24, 44, 71, 34, 42, 11, 67, 9, 69, 47, 95, 93, 72, 12, 40, 98, 83,

        25, 27, 91, 21, 31, 0, 44, 56, 1, 76, 30, 100, 18, 46, 35, 72, 61,

        39, 90, 25, 78, 42, 77, 13, 72, 32, 3, 84, 63, 59, 100, 60, 22, 57,

        50, 40, 63, 65, 2, 27, 88, 63, 40, 97, 94, 69, 72, 98, 2, 68, 13,

        62, 76, 97, 14, 36, 15, 91, 80, 55, 45, 67, 50, 13, 49, 54, 72,

        84, 36, 69, 74, 35, 30, 47, 64, 91, 24, 16, 41, 41, 19, 96, 25,

        38, 60, 43, 86, 6, 23, 81, 71, 73, 56, 12, 44, 67, 28, 39, 1,

        52, 40, 28, 45, 44, 53, 63, 7, 66, 45, 44, 68, 6, 98, 100, 95]

k = 787

print("Test case :-nk=",k," nnums = ",nums[0:10],".....")

print("-----------------------------------------")

Solution.solve(nums, k)

print("-----------------------------------------")

nums = [0, 0, 0]

k = 0

print("Test case :-nk=",k," nnums = ",nums)

print("-----------------------------------------")

Solution.solve(nums, k)

print("-----------------------------------------")

Попробуйте так:

Строка, которую ввел пользователь разбивается методом .split(), после чего обрезаются ненужные пробелы методом .strip() (На самом деле все немного по другому, но это не важно), затем цикл пробегает по тому, что осталось (числа, или символы) и передает каждый елемент функции int(), которая в свою очередь передает каждый результат в список, а конструкция try обрабатывает случаи, когда введено не число:

try:
    nums = [int(n) for n in input('Введите числа: ').strip().split()]
except ValueError:
    print("Ошибка. Вводите пожалуйста только числа")
lab = sum(nums) # Воспользовался встроеной функцией суммы
print(lab)

P.S.: int(nums) Возвращает число. Все объекты, на которые нет ссылки — добыча сборщика мусора:

#Ваш код:
nums = input("Введите число: ")
int(nums) # <- Будет съедено сборщиком мусора
lab = nums[0] + nums[1] + nums[2]
print(lab)

Обложка к статье "Найти в Python сумму, произведение и среднее арифметическое трёх целых чисел"

На чтение 3 мин Просмотров 2к. Опубликовано

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

Как найти сумму, произведение и среднее арифметическое трёх целых чисел, введённых по очереди

Сначала рассмотрим вариант, в котором пользователь вводит числа по очереди. Для решения задачи в данном случае мы можем написать следующий код:

# получаем три целых числа от пользователя
num1 = int(input("Введите первое число: "))
num2 = int(input("Введите второе число: "))
num3 = int(input("Введите третье число: "))

# вычисляем сумму, произведение и среднее арифметическое
summ = num1 + num2 + num3
prod = num1 * num2 * num3
avg = summ / 3

# выводим результаты
print("Сумма чисел:", summ)
print("Произведение чисел:", prod)
print("Среднее арифметическое чисел:", avg)

Здесь мы сначала получаем три целых числа от пользователя, используя функцию input(), и затем преобразуем их в целые числа, используя функцию int(). Затем мы вычисляем сумму, произведение и среднее арифметическое, используя соответствующие математические операции, и выводим результаты с помощью функции print().

Как найти сумму, произведение и среднее арифметическое трёх целых чисел, введённых через пробел

А теперь рассмотрим более сложный вариант, когда пользователь вводит сразу три числа через пробел. Для решения этой задачи, нам необходимо использовать метод split(), который позволяет разделить строку на части по заданному разделителю и вернуть список этих частей. Так как разделителем в методе split() по-умолчанию является пробел, то мы можем не указывать его явно.

Напишем код для решения задачи:

# Получаем ввод от пользователя и разбиваем на три части
input_str = input("Введите три целых числа, разделенных пробелами: ")
num1, num2, num3 = input_str.split()

# Преобразуем каждую часть в целое число
num1 = int(num1)
num2 = int(num2)
num3 = int(num3)

# Вычисляем сумму, произведение и среднее арифметическое трех чисел
sum_nums = num1 + num2 + num3
prod_nums = num1 * num2 * num3
avg_nums = sum_nums / 3

# Выводим результаты
print("Сумма трех чисел:", sum_nums)
print("Произведение трех чисел:", prod_nums)
print("Среднее арифметическое трех чисел:", avg_nums)

Этот код принимает три целых числа, разделенных пробелами, от пользователя и вычисляет сумму, произведение и среднее арифметическое этих чисел. Результаты выводятся на экран.

Перейти к контенту

Ответы на stepik и snakify

Сумма трех чисел

Опубликовано: 27.10.2020Рубрика: Snakify Python

Условие: Напишите программу, которая берет три числа и выводит их сумму. Каждое число дается в отдельной строке.

a = int(input())
b = int(input())
c = int(input())
s = a + b + c
print(s)

Этот код сначала вводит три переменные: a, b, c – каждую с новой строки. Затем в переменную «S» считает сумму всех трёх чисел и после выводит командой print() значение.

Полное решение первого модуля snakify.

0 3 254 просмотров

Понравилась статья? Поделить с друзьями:
  • Ошибка в декларации 3 ндфл как исправить в личном кабинете налогоплательщика
  • Как найти скорость изображения в плоском зеркале
  • Как найти смешную игру
  • Как найти компоненты действия сложения
  • Как найти подходящий домен