Cod sursa(job #879309)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 15 februarie 2013 11:10:49
Problema Nunta Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.03 kb
#include <cstdio>

//Lungimea maxima a unui numar mare
#define l_max 300

//Un numar mare
struct mare
{
    short int v[l_max];
};

//Functia de maxim
int maxim(int a,int b)
{
    if(a>b)
        return a;
    return b;
}

//Functiile specifice unui numar mare
void init(mare &a)
{
    int i;

    for(i=0;i<l_max;i++)
        a.v[i]=0;
}

mare suma(mare &a,mare &b)
{
    mare aux;
    init(aux);

    aux.v[0]=maxim(a.v[0],b.v[0])+1;

    int i;
    int transport=0;

    for(i=1;i<=aux.v[0];i++)
    {
        aux.v[i]=a.v[i]+b.v[i]+transport;

        transport=aux.v[i]/10;
        aux.v[i]%=10;
    }

    while(aux.v[aux.v[0]]==0)
    {
        aux.v[0]--;
    }

    return aux;
}

void afis(mare &a)
{
    int i;
    for(i=a.v[0];i>0;i--)
        printf("%hd",a.v[i]);
    printf("\n");
}

void init_scalar(mare &a,int x)
{
    while(x>0)
    {
        a.v[a.v[0]+1]=x%10;
        a.v[0]++;
        x/=10;
    }
}

int main()
{
    //Deschiderea fisierelor de intrare si iesire
    freopen("nunta.in","r",stdin);
    freopen("nunta.out","w",stdout);

    //n - al catelea termen al Sirului lui Fibonacci trebuie cautat
    int n;

    //Citim n
    scanf("%d",&n);

    //Cele doua cazuri de baza, particulare
    if(n==1)
    {
        printf("1\n");
        return 0;
    }
    else if(n==2)
    {
        printf("2\n");
        return 0;
    }

    //Cele trei numere mari ce vor fi folosite pentru calculul iterativ al termenului curent al Sirului lui Fibonacci
    mare a,b,c;

    //Le initializam pe primele doua cu 0
    init(a);
    init(b);

    //Le initializam pe primele doua cu 1 respectiv 2
    init_scalar(a,1);
    init_scalar(b,2);

    //i - contor
    int i;

    //Calculam al n-lea numar Fibonacci
    for(i=2;i<n;i++)
    {
        init(c);

        c=suma(a,b);
        a=b;
        b=c;
    }

    //Se afiseaza al n-lea termen al Sirului lui Fibonacci, reprezentand chiar raspunsul problemei
    afis(c);

    return 0;
}