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\$
  • 1
    \$\begingroup\$ sum(n for n in range(1000) if not n%3 or not n%5) \$\endgroup\$ – dansalmo Dec 29 '13 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\$ – AdmiralAdama Apr 4 '16 at 8:50
6
\$\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\$
  • \$\begingroup\$ Oh, sorry, my mistake, I inputted 100 instead of 1000 @Josay \$\endgroup\$ – LazySloth13 Mar 3 '13 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 '13 at 17:04

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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