Raafat Abualazm
Raafat Abualazm

Reputation: 74

How to compute partial sum of Fibonacci series?

I'm doing Algorithmic Toolbox course on Coursera and I'm stuck on problem 7 of the assignment. It is required to get the partial sum between two given Fibonacci numbers, actually the Problem statement want the last digit of that sum.

I know what the sum from 0 to Fn is Fn+2 - 1

So the partial sum Between Fx and Fy is

Fx+2 - Fy+1, am I right?

I will use Pisano Sequence to get the last digit of any Fibonnacci number,by getting its modulo with length of the sequence, so far so good.

This However all fail when the input is:

9999999999999999 99999999999999999

My Program outputs 4 and the answer is actually 6.

I've checked how many bits are needed to represent each number and both are withing the range of 64 bits and I'm using unsigned 64 bit integers.

I'm not sure what's the problem here.

#include <iostream>
#include <vector>
using namespace std;

vector<uint64_t> fibList; // Fibonacci numbers List
vector<uint64_t> pisanoSequence; // Pisano Sequence list
void generatePisanoSequence(int mod)
{
    fibList.push_back((*(fibList.end()-1) + *(fibList.end()-2)) % mod); // Get the last digits of the next Fibonacci number depending on the modulp. 
    pisanoSequence.push_back(*(fibList.end()-1)); //Put the last digit of the last Fibonacci number in the Pisano Sequence
    if (*(pisanoSequence.end() - 1) == 1 && *(pisanoSequence.end() - 2) == 0) // If we return to having 0 then 1 as inputs to the Pisano sequence that mean we have reached the end of the period of the sequence
    {
        return; // Stop Generating entries
    }
    else
    {
        generatePisanoSequence(mod); // Calculate the next entry.
    }
}
int main()
{
    fibList.push_back(0); // Put 0 to the Fibonacci sequence
    fibList.push_back(1); // Put 1 to the Fibonacci sequence
    pisanoSequence.push_back(0); // Put 0 to the Pisano Sequence
    pisanoSequence.push_back(1); // Put 1 to the Pisano sequence
    generatePisanoSequence(1000); // An Examplry Modulos of 1000
    uint64_t n, m; // Input Fibonacci numbers
    cin >> n >> m;
    if (m == n) //If the same number entered for both, simply get the last digit of that number/
    {
        m  = m % pisanoSequence.size(); //Find its place in the Pisano sequence
        cout << pisanoSequence[m] % 10; // Get the number and print and its units digits
        return 0;
    }
    if (m > n) swap(m,n); //If m is bigger than n, i.e the second Fibonacci is bigger than the first, swap them.
    n = n + 2; //Get Fn+2
    m = m + 1; //Get Fm+1
    n = n % (pisanoSequence.size()); // Get its position in Pisano Sequence
    m = m % (pisanoSequence.size()); // Get its position in Pisano Sequence
    uint64_t n2 = pisanoSequence[n]; //Get the number
    uint64_t m2 = pisanoSequence[m]; //Get the number
    int64_t z = n2 - m2; //Subtract the numbers to find the partial sum
    z = abs(z); //If negative make it positive because the sum is +ve and the subtraction might yield negative.
    cout << z % 10; // Print the units of the sum

return 0;
}

Upvotes: 1

Views: 2395

Answers (1)

CrafterKolyan
CrafterKolyan

Reputation: 1052

z = abs(z) is wrong

If you get -4 then the answer is 6 so instead of z = abs(z) it should be z = (z % 10 + 10) % 10;

Upvotes: 2

Related Questions