Cod sursa(job #79465)

Utilizator vanila_CPPIonescu Victor Cristian vanila_CPP Data 22 august 2007 16:13:24
Problema Sarpe Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.2 kb
#include <cstdio>
#include <cstdlib>
#include <cctype>
typedef int* numar;
numar n;


void iofile(void)
{
	int c,aux,i;
	n=(int *)malloc(2050*sizeof(int));
	freopen("sarpe.in","r",stdin);
	freopen("sarpe.out","w",stdout);
	n[0]=0;
	while (isdigit(c=getchar()))
	{
		n[++n[0]]=c-'0';
	}
	fclose(stdin);
	for (i=1;i<=(n[0]/2);i++)
	{
		aux=n[i];
		n[i]=n[n[0]-i+1];
		n[n[0]-i+1]=aux;
	}
}

void suma(numar a, numar b, numar c)
{
	int i,x,t;
	i=1;t=0;
	while ((i<=a[0])&&(i<=b[0]))
	{
		x=a[i]+b[i]+t;
		c[i]=(x%10);
		t=(x/10);
		i++;
	}
	if (i<=a[0])
	{
		while (i<=a[0])
		{
			x=a[i]+t;
			c[i]=(x%10);
			t=(x/10);
			i++;
		}
	} else
	{
		while (i<=b[0])
		{
			x=b[i]+t;
			c[i]=(x%10);
			t=(x/10);
			i++;
		}
	}
	c[0]=i-1;
	if (t!=0)
	{
		c[0]++;
		c[c[0]]=t;
	}
}
void deplasare(numar a,int k)
{
	int i;
	for (i=a[0];i>=1;i--)
	{
		a[i+k]=a[i];
	}
	for (i=1;i<=k;i++)
	{
		a[i]=0;
	}
	a[0]+=k;
}
void nr_cifra_des(numar a, int c, numar b)
{
	int i,x,t;
	t=0;
	for (i=1;i<=a[0];i++)
	{
		x=a[i]*c+t;
		b[i]=(x%10);
		t=(x/10);
	}
	b[0]=a[0];
	if (t!=0)
	{
		b[0]++;
		b[b[0]]=t;
	}
}
void inmultire(numar a, numar b, numar d)
{
	int i;
	numar e;
	d[0]=1;
	d[1]=0;
	e=(int *)malloc(2050*sizeof(int));
	for (i=1;i<=b[0];i++)
	{
		nr_cifra_des(a,b[i],e);
		deplasare(e,i-1);
		suma(d,e,d);
	}
}

void scadere(numar a,numar b,numar c)
{
	int t,x,i;
	c[0]=a[0];
	while (b[0]<a[0])
	{
		b[++b[0]]=0;
	}
	t=0;
	for (i=1;i<a[0];i++)
	{
		x=a[i]-b[i]+10+t;
		c[i]=(x%10);
		t=(x/10);
	}
	x=a[a[0]]-b[b[0]]+t;
	c[a[0]]=(x%10);
	while ((c[c[0]]==0)&&(c[0]>1))
	{
		c[0]--;
	}
}
void prel(void)
{
	numar a,b,c,d,e;
	int i;
	a=(int *)malloc(2050*sizeof(int));
	b=(int *)malloc(2050*sizeof(int));
	c=(int *)malloc(2050*sizeof(int));
	d=(int *)malloc(2050*sizeof(int));
	e=(int *)malloc(2050*sizeof(int));
	e[0]=1;
	e[1]=1;
	scadere(n,e,a);
	e[0]=1;
	e[1]=2;
	scadere(n,e,b);
	inmultire(a,b,c);
	inmultire(c,e,a);
	e[0]=1;
	e[1]=4;
	inmultire(n,e,b);
	suma(a,b,c);
	for (i=c[0];i>=1;i--)
	{
		printf("%d",c[i]);
	}
	printf("\n");
	fclose(stdout);
}
int main(void)
{
	iofile();
	prel();
	return 0;
}