Cod sursa(job #935053)

Utilizator mvcl3Marian Iacob mvcl3 Data 1 aprilie 2013 13:03:07
Problema Nunta Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#include <string.h>
#include <assert.h>
#define maxSize 80
#ifndef BIGNUMBER_H
#define BIGNUMBER_H
#include <cstdio>
using namespace std;
class BigNumber
{
    public:
        BigNumber();
        BigNumber(int, int);
        const BigNumber& operator=(const BigNumber& other);
        const BigNumber& operator+(const BigNumber& other);
        void write_Data()
        {
            freopen("nunta.out", "w", stdout);
            for(int i = this->a[0]; i; -- i) printf("%d", this->a[i]);
        }
    protected:
    private:
        int *a;
};

#endif

BigNumber :: BigNumber()
{
    a = new int[maxSize];
    for(int i = 0; i < maxSize; ++i) a[i] = 0;
}

BigNumber :: BigNumber(int x, int y)
{
    a = new int[maxSize];
    a[0] = x, a[1] = y;
}

const BigNumber& BigNumber :: operator=(const BigNumber& other)
{
    assert(a);

    a = new int[maxSize];
    for(int i = 0; i <= other.a[0]; ++i) a[i] = other.a[i];

    return *this;
}

const BigNumber& BigNumber :: operator+(const BigNumber& other)
{
    BigNumber rez(*this);
    int i, t;
    int n = rez.a[0], m = other.a[0];
    for(i = 1, t = 0; i <= n || i <= m || t; ++i, t /= 10)
        rez.a[i] = (t += rez.a[i] + other.a[i]) % 10;
    rez.a[0] = i - 1;
    return *this;
}

int n;

int main() {
    freopen("nunta.in", "rt", stdin);
    scanf("%d", &n);

    if(n <= 2)
    {
        freopen("nunta.out", "wt", stdin);
        printf("%d\n", n);
    }
    else
    {
        BigNumber A(1, 1);
        BigNumber B(1, 2);
        BigNumber C;
        for(int i = 3; i <= n; ++i) {
            C = A + B;
            A = B;
            B = C;
        }
        C.write_Data();
    }
}