Как найти сумму всех кратных 3 или 5 ниже 1000 в Python? - PullRequest
11 голосов
/ 09 мая 2011

Не уверен, стоит ли мне публиковать это на math.stackexchange, но оно включает больше программ, поэтому я разместил его здесь.

Вопрос кажется очень простым, но я сидел здесь по крайней мереодин час сейчас не разгадал.Я пробовал разные решения и читал математические формулы для него и т. Д., Но это не даст мне правильного ответа при его кодировании!Я сделал два разных решения для этого, и оба дают мне неправильный ответ.Первое решение дает мне 265334, а второе дает мне 232169. Ответ - 233168, поэтому второе решение ближе.

Я должен упомянуть, что это вопрос от Project Euler, первый если быть точным.

Вот мой код.Есть идеи что не так?

nums = [3, 5]
max = 999

result = 0
for num in nums:
    for i in range(1,max):
        if num*i < max:
            result += num*i
print result


result = 0
for i in range(0,max):
    if i%3 == 0 or i%5 == 0:
        result += i

print result

Ответы [ 18 ]

16 голосов
/ 09 мая 2011

Вы слишком усложняете вещи. Вам просто нужен список чисел, кратный 3 или 5, который вы можете легко получить с помощью списка :

>>> [i for i in range(1000) if i % 3 == 0 or i % 5 == 0]

Затем используйте sum, чтобы получить сумму:

>>> sum([i for i in range(1000) if i % 3 == 0 or i % 5 == 0])
<<< 233168

Или даже лучше использовать генераторное выражение вместо:

>>> sum(i for i in range(1000) if i % 3 == 0 or i % 5 == 0)

Или даже лучше лучше (любезно предоставлено Exelian):

>>> sum(set(list(range(0, 1000, 3)) + list(range(0, 1000, 5))))
5 голосов
/ 09 мая 2011

range(k,max) не включает max, поэтому вы действительно проверяете до 998 включительно (в то время как 999 кратно 3).Вместо этого используйте range(1,1000).

2 голосов
/ 30 июля 2014

результат = 0

для i в диапазоне (0,1000):

if (i % 3 == 0 or i % 5 == 0):

    print i

    result = result + i

результат печати


0

3

5

6

9

.,.

993

995

996

999

233168

2 голосов
/ 09 мая 2011

Мне нравится это больше всего:

def divisibles(below, *divisors):
    return (n for n in xrange(below) if 0 in (n % d for d in divisors))

print sum(divisibles(1000, 3, 5))
2 голосов
/ 09 мая 2011

Проблема с вашим первым решением состоит в том, что он дважды учитывает кратные 15 (потому что они кратны как 3, так и 5).

Проблема с вашим вторым решением состоит в том, что оно не считается 999(кратно 3).Просто установите max = 1000, чтобы исправить это.

1 голос
/ 23 сентября 2018
t = int(input())
for a in range(t):
n = int(input().strip())
sum=0
for i in range(0,n):
       if i%3==0 or i%5==0:
            sum=sum+i
print(sum)
1 голос
/ 28 января 2018

Я думаю, что только последние несколько строк из вашего кода важны.Оператор or является ключевым в этом коде.Кроме того, чем установка максимального значения на 999, вы должны установить его на 1000, чтобы оно охватывало все значения.Вот мой код.

    ans=0
    for i in range(1,1000):
        if(i%3==0 or i%5==0):
            ans += i
    print(ans)
    input('press enter key to continue');#this line is only so that the screen stays until you press a key
1 голос
/ 21 июня 2017

Я знаю, что это было 6 лет назад, но я просто подумал, что id поделился решением, которое было найдено из математической формулы, которая показалась мне интересной, так как она устраняет необходимость циклически перебирать все числа.

https://math.stackexchange.com/a/9305

def sum_of_two_multiples(nums, maxN):
    "takes tuple returns multiples under maxN (max number - 1)"
    n1, n2 = nums = nums[:2]
    maxN -= 1
    def k(maxN, kx):
        n = int(maxN / kx)
        return int(kx * (0.5 * n * (n+1)))

return sum([k(maxN, n) for n in nums]) - k(maxN, n1*n2)

Выводит следующее

print(sum_of_two_multiples((3,5), 10))
# 23
print(sum_of_two_multiples((3,5), 1000))
# 233168
print(sum_of_two_multiples((3,5), 10**12))
# 233333333333166658682880
1 голос
/ 23 марта 2017

Есть кратные по полу (999/3) по 3, кратные по полу (999/5) по 5 и кратные по полу (999/15) от 15 до 1000.

Для 3 это:3 + 6 + 9 + 12 + ... + 999 = 3 * (1 + 2 + 3 + 4 + ... + 333)

= 3 * (333 * 334/2), поскольку суммаиз целых чисел от 1 до k равен k * (k + 1) /2.

Используйте ту же логику для суммы, кратной 5 и 15. Это дает решение с постоянным временем.Обобщите это для произвольных входных данных.

1 голос
/ 23 августа 2012

Я знаю, что это было 3 месяца назад, но в качестве эксперимента, потому что я новичок в python, я решил попробовать объединить ответы других людей, и я придумал метод, которому можно передать максимальное число и делители как список и возвращает сумму:

def sum_of_divisors(below, divisors):
    return sum((n for n in xrange(below) if 0 in (n % d for d in divisors)))

max = 1000
nums = [3, 5]

print sum_of_divisors(max, nums)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...