Обработка числовой последовательности

Есть задание:

В файле содержится последовательность из 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 шт):

Автор решения: 4500zenja

Проблема в том, что Вы делаете циклы с 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))
→ Ссылка