5
\$\begingroup\$

This is my python solution to the first problem on Project Euler:

n = 1
rn = 0
while n < 1000:
    if n%3 == 0 or n%5 == 0:
        rn += n
    n = n + 1
print(rn)

I would like to find a way to keep everything in this python code to as little number of lines as possible (maybe even a one liner??), and possibly improve the speed (it's currently around 12 ms). By the way, this is the problem:

If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.

Find the sum of all the multiples of 3 or 5 below 1000.

Suggestions?
Thanks.

\$\endgroup\$
2
  • 1
    \$\begingroup\$ sum(n for n in range(1000) if not n%3 or not n%5) \$\endgroup\$
    – dansalmo
    Dec 29, 2013 at 21:28
  • \$\begingroup\$ I like your solution to the problem. It is much more efficiently coded than another Project Euler #1 code question I just read. \$\endgroup\$ Apr 4, 2016 at 8:50

1 Answer 1

8
\$\begingroup\$

Python hint number 1:

The pythonic way to do :

n = 1
while n < 1000:
    # something using n
    n = n + 1

is :

for n in range(1,1000):
    # something using n

Python hint number 2:

You could make your code a one-liner by using list comprehension/generators :

print sum(n for n in range(1,1000) if (n%3==0 or n%5==0))

Your code works fine but if instead of 1000, it was a much bigger number, the computation would take much longer. A bit of math would make this more more efficient.

Math hint number 1 :

The sum of all the multiples of 3 or 5 below 1000 is really the sum of (the sum of all the multiples of 3 below 1000) plus (the sum of all the multiples of 5 below 1000) minus the numbers you've counted twice.

Math hint number 2 :

The number you've counted twice are the multiple of 15.

Math hint number 3 :

The sum of the multiple of 3 (or 5 or 15) below 1000 is the sum of an arithmetic progression.

\$\endgroup\$
2
  • \$\begingroup\$ Oh, sorry, my mistake, I inputted 100 instead of 1000 @Josay \$\endgroup\$ Mar 3, 2013 at 13:02
  • 2
    \$\begingroup\$ Math hint #4: every number that is divideable by an odd number is an odd number itself (so you can skip half of the loop iterations). @Lewis \$\endgroup\$
    – 11684
    Mar 3, 2013 at 17:04

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.