Проблема здесь в том, что вы добавляете все числа, кратные 3, и все числа, кратные 5, что включает числа, кратные обоим (например, 15
, 30
, 45
и т. Д.) Дважды.
Для упрощения, давайте рассмотрим ту же проблему, но с коэффициентами 3 и 5 ниже 20.
Изменив цикл while на while x < 20
& while y < 20
соответственно, мы получим два списка:
x_list = [3, 6, 9, 12, 15, 18]
y_list = [5, 10, 15]
Текущий код sum(x_list + y_list)
соответствует sum([3, 6, 9, 12, 15, 18, 5, 10, 15])
, что дает нам 93
, но если вы посмотрите внимательно, это включает 15 дважды, потому что это кратное 3 и 15, что нам не нужно.
Здесь мы хотим удалить все дубликаты из списка x_list + y_list
, однако нет необходимости перебирать списки и удалять дубликаты, потому что Python имеет тип данных, разработанный для этого, который называется set
. Набор определен в документации Python как «Неупорядоченные коллекции уникальных элементов», и хотя он может не хранить порядок элементов внутри него (что может иметь значение в некоторых ситуациях), мы просто пытаемся не иметь дубликатов, чтобы мы можем получить правильную сумму, поэтому нам все равно, в каком порядке они находятся.
Продолжая упрощенный пример, set(x_list + y_list)
соответствует sum({3, 5, 6, 9, 10, 12, 15, 18})
, который, как вы можете заметить, включает в себя только 15
один раз и дает нам 78
, что на 15 меньше 93
.
Следовательно, ваша вторая до последней строки должна вместо этого читать numsum = sum(set(x_list + y_list))
, что в исходной ситуации (сумма, кратная 3 и 5 ниже 1000) даст вам 233168
. Подсчет всех этих дубликатов привел к отключению вычисления на 33165
.
Примечание: хотя я нашел это решение независимо, ранее оно было упомянуто в комментариях от Чернослив