Uva 10579 - Fibonacci Numbers

#include<bits/stdc++.h>
using namespace std;

string fibo_num[1000+19];

string not_equal(string a, string b)
{
    int i=a.size()-1,j=b.size()-1, sum=0, carry=0;

    string s="";

    for(; i>=0; i--)
    {
        sum = a[i] - 48;

        if(j>=0)
        {
            sum += (b[j] - 48);
            j--;
        }

        sum+=carry;

        if(sum > 10)
        {
            s += (sum % 10) + 48 ;
            carry = sum/10;
        }

        else
        {
            s += (sum % 10) + 48;
            carry = sum / 10;
        }
    }

    if(carry)
    {
        s+=(carry + 48);
    }

    reverse(s.begin(), s.end());

    return s;
}

string _equal(string a, string b)
{
    int i=a.size()-1, j=b.size()-1, sum=0, carry=0;

    string s="";

    for(; i>=0, j>=0; i--, j--)
    {
        sum = (a[i]-48) + (b[j]-48);

        sum+=carry;

        if(sum > 10)
        {
            s += (sum % 10) + 48;
            carry = sum / 10;
        }

        else
        {
            s += (sum % 10) + 48;
            carry = sum / 10;
        }
    }

    if(carry)
    {
        s+=(carry + 48);
    }

    reverse(s.begin(), s.end());

    return s;
}

void get_fibonacci()
{
    fibo_num[0] = "0";
    fibo_num[1] = "1";

    for(int i=2; i<=1009; i++)
    {
        string x = fibo_num[i-1];
        string y = fibo_num[i-2];

        if(x.size() > y.size())
        {
            fibo_num[i] = not_equal(x,y);
        }

        else if(x.size() < y.size())
        {
            swap(x,y);

            fibo_num[i] = not_equal(x,y);
        }

        else
        {
            fibo_num[i] = _equal(x,y);
        }
    }
}

int main()
{
    get_fibonacci();
    int n;
    while(cin >> n)
    {
        cout << fibo_num[n] << "\n";
    }

    return 0;
}

Comments

Popular posts from this blog

SPOJ-CMG - Collecting Mango

LightOJ 1009 - Back to Underworld

LeetCode Palindrome Number