Обработка числовой последовательности
Есть задание:
В файле содержится последовательность из 10 000 целых положительных чисел. Каждое число не превышает 10 000. Определите и запишите в ответе сначала количество пар элементов последовательности, у которых сумма элементов кратна 7, затем максимальную из сумм элементов таких пар. В данной задаче под парой подразумевается два различных элемента последовательности. Порядок элементов в паре не важен.
Мой код:
with open('file.txt') as f:
s = [int(x) for x in f]
result = []
for i in range(0, len(s) - 1):
for j in range(1, len(s)):
if (s[i] + s[j]) % 7 == 0:
r.append(s[i] + s[j])
print(len(r), max(r))
Ответ должен быть таким: 7142586 19992 (1 - количество пар, кратных 7; 2 - максимальная возможная сумма)
Мой код в результате выдаёт 14283730 19992. Не могу понять, почему отличается количество пар
Ответы (1 шт):
Проблема в том, что Вы делаете циклы с i и j не зависящими друг от друга, от чего легко могут быть случаи, когда одна и та же пара чисел будет засчитана дважды. Например, при i = 2 и j = 3 программе ничего не мешает взять i = 3 и j = 2 и обработать её, хотя по идее пара чисел с данными индексами будет эквивалентна предыдущей паре.
Для решения достаточно начинать второй цикл не с 1, а с i + 1 — так не будет повторяющихся пар, и все пары чисел будут обработаны ровно единожды.
with open('file.txt') as f:
s = [int(x) for x in f]
result = []
for i in range(0, len(s) - 1):
for j in range(i + 1, len(s)): # <----
if (s[i] + s[j]) % 7 == 0:
r.append(s[i] + s[j])
print(len(r), max(r))