Cod sursa(job #480407)

Utilizator miculprogramatorA Cosmina - vechi miculprogramator Data 27 august 2010 17:15:26
Problema Patrate2 Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <stdio.h>
using namespace std;

#define MAX 10000

int fact[MAX], put[MAX];
int n, i, j, k;

void inmultire_nr_mic (int nr[], int x)
{
    int t = 0;
    for (i=1; i<=nr[0] || t; ++i)
    {
        t /= MAX;
        t += (nr[i] * (x % 10));
        nr[i] = t % MAX;
    }
    if (i - 2 > nr[0])
        nr[0] = i - 2;
}

void afisare (int nr[])
{
    FILE *g = fopen ("patrate2.out","w");

    for (i=nr[0]; i>=1; --i)
        fprintf (g, "%d", nr[i]);
    fprintf (g, "\n");

    fclose (g);
}

void initializare (int nr[])
{
    for (i=0; i<MAX; ++i)
        nr[i] = 0;
}

void inmultire (int nr1[], int nr2[])
{
    int prod[MAX], t = 0;
    initializare (prod);

    for (i=1; i<=nr1[0]; ++i)
    {
        t = 0;
        for (j=1; j<=nr2[0] || t; ++j)
        {
            t /= 10;
            t += (prod[i+j-1] + nr1[i] * nr2[j]);
            prod[i+j-1] = t % 10;
        }

        if (i + j - 3 > prod[0])
            prod[0] = i + j - 3;
    }

    for (i=prod[0]; i>=0; --i)
        nr1[i] = prod[i];
}

int main ()
{
    FILE *f = fopen ("patrate2.in","r");

    fscanf (f,"%d", &n);

    put[0] = 1;
    put[1] = 2;

    for (k=1; k<n*n; ++k)
        inmultire_nr_mic (put, 2);
    //afisare (put);

    fact[0] = fact[1] = 1;
    for (k=1; k<=n; ++k)
        inmultire_nr_mic (fact, k);
    //afisare (fact);

    inmultire (put, fact);
    afisare (put);

    fclose (f);
    return 0;
}