Cod sursa(job #306316)

Utilizator DraStiKDragos Oprica DraStiK Data 20 aprilie 2009 13:25:38
Problema Sarpe Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 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 ("1");
		return 0;
	}*/
	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;
}