Skip to main content

Project Euler Problem #1 Multiples of 3 and 5

Spoiler Alert: As the About page of Project Euler says, "Real learning is an active process and seeing how it is done is a long way from experiencing that epiphany of discovery." If you are currently attempting to solve this problem in the archives, please do not continue to read this post. I personally worked through all the problems I post on this blog and it has brought me immense satisfaction. 

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.

Solution: 

This problem can be solved brute-force without too much difficulty by simply doing a for loop from 1 to 999, incrementing by one each time, checking each number to see if it is divisible by either 3 or 5, and if so, adding it to a list. Once the for loop terminates, we can sum all the numbers in the list. 

In C#, you do something like this: 
           Stopwatch stopwatch = new Stopwatch();            
           stopwatch.Start();
           List<int> multiples = new List<int>();
           for (int i = 1; i < 1000; i++)
           {
               if (i % 3 == 0 || i % 5 == 0)
               {
                   multiples.Add(i);
               }
           }
           stopwatch.Stop();
           Console.WriteLine($"Elapsed time (ms): {stopwatch.Elapsed.Milliseconds}");
           Console.WriteLine($"Count: {multiples.Count}");
           Console.WriteLine($"Sum: {multiples.Sum()}");
           Console.ReadLine();

I don't know how many nanoseconds it took, but it took less than 1 millisecond on my machine.

Using LINQ instead of the for loop and leaving everything else the same:
var multiples = Enumerable.Range(3,999-2).Where(x => x % 3 == 0 || x % 5 == 0);

This took 3 milliseconds! I also find it much less readable.

We can figure out how many integers are divisible by 3 or 5 using mental math or a calculator. Recognize that 5 divides 1000 200 times, so it divides 999 199 times, and 3 divides 999 333 times. Therefore we have a total of 532 minus the duplicates of any multiples of 15. If you can't divide 1000 by 15 easily (I couldn't), the answer is 66. So there are 199 + 333 - 66 = 466 different multiples of either 3 or 5 in the range 1:999. 

I've avoided putting the answer in the solution, just in case someone solving the problem on Project Euler ignored the Spoiler Alert. But either of these methods will provide the correct answer.

Comments

Popular posts from this blog

How NOT To Write Code / How To Decipher Bad Code

Confusing code is bad code. In this post I'll be talking about one of the worst coding practices: using nondescript variables. As an example, we'll be looking at a simple problem from Project Euler (#28). I'll give you an example using really bad code and then we'll look at how we can decipher it and make it more clear and understandable. First, here's the problem: Starting with the number 1 and moving to the right in a clockwise direction a 5 by 5 spiral is formed as follows: 21  22 23 24  25 20   7   8   9  10 19  6   1   2 11 18   5   4   3  12 17  16 15 14  13 It can be verified that the sum of the numbers on the diagonals is 101. What is the sum of the numbers on the diagonals in a 1001 by 1001 spiral formed in the same way? Ok, so now check out this solution:             int i = 1; int j = 1; int s = 0; ...

Merging Files into a Single .NET Assembly

.NET assemblies can be single-file or multifile.   As I've been preparing to take Microsoft Exam 70-483, I came across the Al.exe command, a tool which is installed along with Visual Studio. Al stands for "Assembly Linker" and when you run it, it "links" different manifest or resource files together into a single assembly. If you work with .NET at all, you probably have a pretty good idea of what an assembly is, but here's a simple definition from Stack Overflow : "A chunk of (precompiled) code that can be executed by the .NET runtime environment. A .NET program consists of one or more assemblies." -Adrian Grigore Here's a more technical definition from Wikipedia :  "A compiled code library used for deployment, versioning, and security."  Normally when you create a new project in Visual Studio, VS pretty much creates the assembly for you. You don't have to worry about merging different files together using the c...

Programming in R

Image saved from my new ShinyApp Over the past few days I've been playing around with R, a statistical language which is essentially an offshoot of S, which was created in the 1980's. R has some powerful features which enable to it rapidly create meaningful graphical illustrations. I've really enjoyed manipulating some of the datasets on Kaggle with it. Here's a ShinyApp I published to demonstrate a simple R program to track where different plant and animal species live within the US national parks.