Showing posts with label solutions. Show all posts
Showing posts with label solutions. Show all posts

Thursday, May 2, 2019

Programming Challenge no. 2: Fibonacci Sequence (Understanding Pseudocodes)

We are finally solving another programming challenge from Project Euler (after a long, long, long time).

 Our challenge for today:
Each new term in the Fibonacci sequence is generated by adding the previous two terms. By starting with 1 and 2, the first 10 terms will be:
1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ... 
By considering the terms in the Fibonacci sequence whose values do not exceed four million, find the sum of the even-valued terms.
Before we open our compilers to start programming, we need to understand what the problem requires and the conditions we need to consider.

For this challenge, we'll use Java. (Actually, as long as you understand how the code works, you can use any language you feel comfortable to use.)

Analyzing the Problem


What we need to get: 
sum of the even-valued terms in the Fibonacci sequence.

Conditions:
1.) The numbers we need to add are in Fibonacci sequence.
2.) The numbers we need are less than four million (That's a big number!)
3.) The numbers we need are even.

Now that we have established our objective and requirements, let's create a pseudocode for this challenge.

Creating the Pseudocode


A psuedo-wha?

I've mentioned the meaning of this word in the previous puzzle but let me explain it better here. Let's break down the word. When you Google the word "pseudo", the results will tell you that it means "fake" or "mock". So when you say someone is a pseudoscientist, that person is a "fake scientist".

So we're making a "fake code"?

Err.. Well, to be precise, we are writing a code that resembles a programming language. It is not a real code since if you run it in a compiler, it would create errors. This makes sense because pseudocodes are written not for computers but for humans. With pseudocodes, you need not worry about programming language syntax.

Below is an example of pseudocode:

Declare fibonacciFormer, fibonacciLatter, currentFibonacci, limit and sumOfEvenFibonacci to Long
Initialize limit to 4000000
Initialize sumOfEvenFibonacci to 0
Initialize fibonacciFormer to 1
Initialize fibonacciLatter to 1
Initalize currentFibonacci to fibonacciFormer + fibonacciLatter 
While currentFibonacci is lesser than limit
     Check if currentFibonacci is even
         if True
             sumOfEvenFibonacci = sumOfEvenFibonacci + currentFibonacci
      fibonacciFormer = fibonacciLatter
      fibonacciLatter = currentFibonacci
      currentFibonacci = fibonacciFormer + fibonacciLatter

      return sumOfEvenFibonacci


Pause and try to understand what is happening. If your brain is refusing to process the "fake code" above, you'll have a hard time understanding the real one so let me enlighten you. However, if you figured out what the pseudo code does, you can move on to the coding section.

Let's start with what a Fibonacci sequence looks like. The figure below shows the Fibonacci sequence below 100.



So the next number is the number of the two preceding numbers in the sequence. Can you guess what's the next number after 89? Just add 55 and 89!

Now that we understand the Fibonacci sequence, let's go back to our pseudocode. You'll see that we have variables called fibonacciFormer and fibonacciLatter. These contain the preceding numbers while currentFibonacci is the sum of these numbers. Basically, currentFibonacci is the next number in the sequence. We initialized fibonacciFormer and fibonacciLatter to 1 because the Fibonacci sequence always starts with 1. We also initialized sumOfEvenFibonacci to zero.

Now the conditions! We are given the limitation of getting the numbers not greater than 4 million. We can hard code the condition to the number but it is wise to use a variable (in this case, our variable is called limit) so we can easily modify the code in the future when the requirements change.

1.) We will check if the currentFibonacci is lesser than our limit.
      If it is, then we will go inside the loop and arrive in our next condition.
2.) Since the problem set specifically wants even numbers, we need to check if the currentFibonacci is even.
3.) If it is, we add it to our current sumOfEvenFibonacci.
     If it is not, we skip it.
4.) We will then re-assign the values of our fibonacciFormer to get the value of fibonacciLatter.
5.) The variable fibonacciLatter gets the value of our currentFibonacci.
6.) Then we get the next number of our sequence by adding fibonacciFormer and fibonacciLatter and assign it to currentFibonacci.
7.) Then back we go to our loop until finally, we reach the limit.
8.) We exit the loop and we return the sumOfEvenFibonacci, which should contain the sum of our even fibonacci numbers.

And that's what our pseudocode is trying to do.

Coding


So here is our pseudocode written in Java:

public long getSumOfEvenFibonacci(long limit)
    {
      long fibonacciFormer, fibonacciLatter, currentFibonacci, sumOfEvenFibonacci;
      sumOfEvenFibonacci = 0;
      fibonacciFormer = 1;
      fibonacciLatter = 1;
      currentFibonacci = fibonacciFormer + fibonacciLatter;
   
      while(currentFibonacci < limit)
      {
        if(currentFibonacci % 2 == 0)
          sumOfEvenFibonacci = sumOfEvenFibonacci + currentFibonacci;
     
        fibonacciFormer = fibonacciLatter;
        fibonacciLatter = currentFibonacci;
        currentFibonacci = fibonacciFormer + fibonacciLatter;
      }
   
      return sumOfEvenFibonacci;
    }

It looks like our pseudocode, right? Except this one has brackets and semi-colons. Also, notice that to check if the number is even, we used the expression currentFibonacci % 2 == 0. The percentage symbol represents the modulo operation. We'll get to that in another post sometime.

Recommendation


If you run this Java code, it will give you the answer to the second puzzle in Project Euler. But this is not an efficient algorithm.

Algo-what now? Rhythm? We talking about music now?

Let's deal with algorithms in the next puzzle, aight? For now, give yourself a pat for taking the time to understand the Fibonacci sequence and how to get the sum of its even numbers.

Friday, November 7, 2014

Mathematical Solutions: Multiplying Big Numbers


If you are the type of person who has little interest in numbers and would rather draw doodles in your test papers than solve, I know what your feeling. I wish my passion for puzzles equates my skills in numbers, but my brain tends to fly to a completely different world when I start seeing digits.

Big numbers are the scariest, aren't they? I dread the days when the teachers would hand out exam papers and strictly implement the rule: NO CALCULATORS. How am I supposed to calculate these three-digit numbers in half an hour? All twenty sets of them?!

Today, I found out what I should have found out when I was still in school. If you're still studying and struggling in Math, you're lucky to have stumbled upon this article.

This day is the day when you find magic in Mathematics, all thanks to the creative minds of Japanese people. All you need to do to be amazed is click the play button below.


Nuff said. This is truly an art of Mathematics. I'm not taking Math exams anymore, but I could still use this  when I'm kidnapped by mathematical terrorists and I end up becoming one of them because I am capable of multiplying BIG numbers.

Saturday, August 11, 2012

Programming Challenge no. 1: Sum of Multiples of 3 and 5

So I stumbled upon this site called Project Euler (It was named after Leonhard Euler who had a huge contribution in discovering infinitesimal calculus and graph theory.. Not sure if I'm thankful about his discovery.. But I guess I should since it helped improve a lot of things..)

What am I doing in Project Euler? Well, you see.. I promised to answer some programming challenges for you and as I googled the words "programming challenges", I saw this site. It's not bad actually.. I kinda like it :3


/* Warning: Must have at least basic programming experience */


So let's start with their very first challenge:
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.
You can go ahead and get your calculator. I'm not stopping you. However, I must warn you that you're gonna waste at least 15 minutes of your life pressing the multiples of 3 and 5.. and with a huge possibility of committing a mistake..

If I were you, I'd find an algorithm that will give me the final result. One way is solving it the programming style :P


For this challenge, I'll use C as my programming language.
I'll use Turbo C as my compiler. (This doesn't matter actually)
And my left brain to solve the problem! ('Cause for some reason, my right brain hates numbers..)


Analyzing the problem


We are asked to compute the sum of the multiples of 3 and 5. 

In their example, the multiples of 3 and 5 below 10 are given: 3, 5, 6 and 9. Adding these multiples will give us 23. We need to do the same thing. Only this time, we need to find the multiples below 1000.

It's tempting to list down all the multiples then add them together.. but that would be an inefficient way to solve this challenge..

What we need to do is analyze and take note what we need to solve the problem:

  1. Only multiples of 3 and 5 are allowed.
  2. Numbers like 15, 30.. etc. are multiples of 3 and at the same time, of 5.
  3. Multiples should be below 1000.
So basically we need to add numbers below 1000 that are either multiples of 3 or 5 or both..


Creating the Pseudo code


Pseudo codes are useful in creating programs. Since they use simple statements instead of a specific programming language's syntax, they're very easy to read.

So here's the pseudo code for our solution:

sum as unsigned long    // We create a variable sum that holds unsigned long integers 
num as integer             // We create a counter num that will go thru 1 to 999
While num is less than 1000     // Set a condition that will prevent the loop from going beyond 1000
          if num is divisible by 3 or 5     // Check if number is a multiple of 3 or 5
             add num to sum                  // If it is, add it to sum
          add 1 to num                          // Iterate num
print sum                                          // Show output on screen

What will happen is, the computer will go through all the numbers from 0 to 999. Each will be checked if it's divisible by 3 or 5. If the number is indeed a multiple of 3 or 5, it'll be added to the sum.

Now that wasn't so hard right? Now, let's go to the exciting part: coding..

Coding


I'll just show you directly what the code is and explain each part.

void main(){
     unsigned long sum;
     int num;
This part contains the declaration statements. Here, we declared two variables: sum and num
sum shall contain the total value of the multiples. It's unsigned long since we expect a large number. num will be iterated from 1 to 999 so it's basically like a counter.

for(sum = 0, num = 0; num < 1000; i++){
      if((num % 3 == 0) || (num % 5 == 0)){
             sum = sum + num;
     }
}
This loop searches thru the numbers below 1000 and finds the multiples of 3. The condition uses || known as the symbol for OR because we need all the multiples of 3 and 5. Using && (known as AND) will give us only the multiples of both 3 and 5.
printf("%lu", sum);

Note:  The sum should be long since we're dealing with a huge number.


Conclusion


So? Did you understand how to solve this programming problem? If you're still having trouble comprehending the method, don't hesitate to comment.

By the way, if you want a shorter code, here's another version of it..

void main(){
     unsigned long sum;
     int num;
     for(sum = 0, num = 0; num < 1000; sum = sum + ((num % 3 == 0 || num % 5 == 0) ?           num : 0), num++);
     printf("%lu", sum);
}
The italic part of the code is using ternary operation. I'll talk about that next time. I don't want to overwhelm you.

You might be asking: So what's the answer? That would be known only if you program the code yourself :P
I don't wanna spoon-feed you with answers to the Project Euler's challenges. My goal here is to relay what I can about programming. Not become a source of direct answers from a site that challenges you to solve programming problems.

If you want your answers checked or you're having troubles with the code, you can email me directly.

I hope you learned something :)