Давайте рассмотрим довольно классическую задачку на программирование под названием «Сумма трех чисел» (и производную от нее — «Сумму четырех чисел»). Решать будем брутфорс-методом, а затем усовершенствуем решение при помощи рекурсии так, чтобы оно подходило для любой задачи «Сумма 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
? План следующий:
- Добавить первое число в
current
. - Вычесть это число из суммы.
- Сверить с другими числами.
- «Откатить» шаги 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
(
"-----------------------------------------"
)
На чтение 3 мин Просмотров 2.1к. Опубликовано
Данная статья посвящена решению задачи на 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)
Этот код принимает три целых числа, разделенных пробелами, от пользователя и вычисляет сумму, произведение и среднее арифметическое этих чисел. Результаты выводятся на экран.
Попробуйте так:
Строка, которую ввел пользователь разбивается методом .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)
Перейти к контенту
Ответы на 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 263 просмотров