Cod sursa(job #74049)

Utilizator astronomyAirinei Adrian astronomy Data 23 iulie 2007 17:49:30
Problema Sarpe Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <stdio.h>
#include <string.h>

#define MAX_C 2048
#define base 10

typedef int num[MAX_C];

num N, R, PATRU, DOI;

void mul(num A, num B)
{
    int i, j, t;
    num C;
    memset(C, 0, sizeof(C));
    for(i = 1; i <= A[0]; i++)
    {
        for(j = 1, t = 0; j <= B[0] || t; j++, t /= base)
            C[i+j-1] = (t += C[i+j-1]+A[i]*B[j]) % base;
        if(i+j-2 > C[0])
            C[0] = i+j-2;
    }
    memcpy(A, C, sizeof(C));
}

void dec(num A)
{
    int i = 1;

    while(A[i] == 0)
        A[i] = 9, i++;
    A[i]--;

    if(A[A[0]] == 0)
        A[0]--;
}

void add(num A, num B)
{
    int i, t = 0;
    for(i = 1; i <= A[0] || i <= B[0] || t; i++, t /= base)
        A[i] = (t += A[i]+B[i]) % base;
    A[0] = i-1;
}

void read_and_solve(void)
{
    int i, j;
    char sir[1024];

    scanf("%s\n", &sir);
    N[0] = strlen(sir);

    for(i = 0; i < N[0]; i++)
        N[N[0]-i] = sir[i]-'0';
    memcpy(R, N, sizeof(num));

    if(N[0] == 1)
    {
        if(N[1] == 1)
        {
            printf("2\n");
            return ;
        }
        if(N[2] == 2)
        {
            printf("4\n");
            return ;
        }
    }
    
    dec(N);
    mul(R, N);
    DOI[0] = 1, DOI[1] = 2;
    mul(R, DOI);
    PATRU[0] = 1, PATRU[1] = 4;
    add(R, PATRU);

    for(i = R[0]; i >= 1; i--)
        printf("%d", R[i]);
    printf("\n");
}

int main(void)
{
    freopen("sarpe.in", "rt", stdin);
    freopen("sarpe.out", "wt", stdout);

    read_and_solve();

    return 0;
}