Cod sursa(job #306332)

Utilizator DraStiKDragos Oprica DraStiK Data 20 aprilie 2009 13:58:04
Problema Sarpe Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <stdio.h>
#include <string.h>
#define DIM 10005
char n[DIM];
int aux1[DIM],aux2[DIM],rez[DIM];
int nr1[DIM],nr2[DIM];
void mul1 (int a[DIM],int b)
{
    int i,t=0;
    for (i=1;  i<=a[0] || t; ++i, t /= 10)
        a[i]=(t+=a[i]*b)%10;
    a[0]=i-1;
}
void mul (int a[DIM],int b[DIM])
{
    int i,j,t,c[DIM];
    memset (c,0,sizeof(c));
    for (i=1; i<=a[0]; ++i)
    {
        for (t=0, j=1; j<=b[0] || t; ++j, t/=10)
            c[i+j-1]=(t+=c[i+j-1]+a[i]*b[j])%10;
        if (i+j-2>c[0])
            c[0]=i+j-2;
    }
    memcpy (a,c,sizeof (c));
}
void dif (int a[DIM],int b[DIM])
{
    int i,t=0;
    for (i=1; i<=a[0]; ++i)
		a[i]+=(t=(a[i]-=b[i]+t)<0)*10;
    for (; a[0]>1 && !a[a[0]]; --a[0]);
}
void add (int a[DIM],int b[DIM])
{
    int i,t=0;
	for (i=1; i<=a[0] || i<=b[0] || t; ++i, t/=10)
		a[i]=(t+=a[i]+b[i])%10;
	a[0]=i-1;
}
void print ()
{
	int i;
	for (i=rez[0]; i; --i)
		printf ("%d",rez[i]);
}
void memcpy (int a[DIM],char b[DIM])
{
	int i;
	for (i=rez[0]; i; --i)
		a[i]=b[rez[0]-i]-'0';
}
int main ()
{
	freopen ("sarpe.in","r",stdin);
	freopen ("sarpe.out","w",stdout);
	gets (n);
	if (n[0]=='1' && strlen (n)==1)
		printf ("2");
	else
	{
        nr1[0]=nr1[1]=nr2[0]=1;
        nr2[1]=2;
        rez[0]=aux1[0]=aux2[0]=strlen (n);
        memcpy (rez,n);
        memcpy (aux1,n);
        memcpy (aux2,n);
        mul1 (rez,4);
        dif (aux1,nr1);
        dif (aux2,nr2);
        mul (aux1,aux2);
        mul1 (aux1,2);
        add (rez,aux1);
        print ();
	}
    return 0;
}