Reputation: 74
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
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