Суммирование кратных 3 и 5 до 1000 с использованием Python - PullRequest
0 голосов
/ 14 сентября 2018

Я написал программу, предназначенную для нахождения суммы всех кратных 3 и 5 под 1000. Я получаю вывод 266333, но это не правильный ответ.Пожалуйста, помогите, вот мой код:

x = 3
y = 5
x_list = []
y_list = []

while x < 1000:
    x_list.append(x)
    x += 3

while y < 1000:
    y_list.append(y)
    y += 5

numsum = sum(x_list + y_list)
print(numsum)

1 Ответ

0 голосов
/ 17 сентября 2018

Проблема здесь в том, что вы добавляете все числа, кратные 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.

Примечание: хотя я нашел это решение независимо, ранее оно было упомянуто в комментариях от Чернослив

...