Cod sursa(job #320690)

Utilizator Anamaria20Cotirlea Anamaria Anamaria20 Data 5 iunie 2009 15:14:50
Problema Sarpe Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.84 kb
#include <stdio.h>
#include <string.h>

FILE *f,*s;

char v[10001];
int n[10001],rezp[10001],c[10001],i,j;

void suma(int x[10001], int y[10001])
{
	int T=0;
	
	if(y[0]>x[0])
	{
		for (i=x[0]+1; i<=y[0]; i++) x[i]=0;
		x[0]=y[0];
	}
    else	
		for (i=y[0]+1; i<=x[0]; i++) y[i]=0;
	
	for (i=y[0]+1; i<=x[0]; i++) y[i]=0;
	
	for (i=1;i<=x[0];i++)
	{
		x[i]+=y[i]+T;
		T=x[i]/10;
		x[i]%=10;
	}
	
	if (T)
	{
		x[0]++;
		x[x[0]]=T;
	}
}

void scadere(int x[10001],int y[10001]) 
{
	int T=0;
	for(i=y[0]+1;i<=x[0];) 
		y[i++]=0;
	
	for(i=1;i<=x[0];i++)
	{
		x[i]=x[i]-(y[i]+T); 
		if(x[i]<0) 
			T=1; 
		else 
			T=0;
		
		if(T) 
			x[i]+=10; 
	}
	
	while (!x[x[0]]) 
		x[0]--;
}

void inmultire(int x[10001], int y)
{
	unsigned long T=0;
	
	for(i=1;i<=x[0];i++)
	{
		x[i]=x[i]*y+T; 
		T=x[i]/10; 
		x[i]=x[i]%10; 
	}
	
	while (T) 
	{
		x[0]++;
		x[x[0]]=T%10;
		T/=10;
	}
}

void inmultire2(int x[10001], int y[10001]) 
{
	int T=0, R[10001];
	
	R[0]=x[0]+y[0]-1; 
	for(i=1;i<=x[0]+y[0];) R[i++]=0; 
	
	for (i=1;i<=x[0];i++)
		for (j=1;j<=y[0];j++)
			R[i+j-1]+=x[i]*y[j];
	
	for (i=1;i<=R[0];i++)
	{
		R[i]+=T;
		T=R[i]/10;
		R[i]%=10;
	}
	
	if (T)
	{
		R[0]++; 
		R[R[0]]=T;
	}
	
	x[0] = R[0];
	for(i=1;i<=x[0];i++)
		x[i]=R[i];
}

int main()
{
	f=fopen("sarpe.in","r");
	s=fopen("sarpe.out","w");
	
	fscanf(f,"%s",&v);
	
	n[0]=strlen(v);
	rezp[0]=n[0];
	
	j=1;
	for(i=n[0]-1;i>=0;i--)
	{
		n[j]=int(v[i])-48;
		rezp[j]=n[j];
		
		j++;
	}	
	
	c[0]=1;
	c[1]=1;
	
	scadere(rezp,c);
	
	if(rezp[0]==0)
		rezp[0]=1;
	
	c[1]=2;
	
	scadere(n,c);
	
	if(n[0]==0)
		n[0]=1;
	
	inmultire2(rezp,n);
	
	inmultire(rezp,2);
	
	suma(n,c);
	
	inmultire(n,4);
	
	suma(n,rezp);
	
	for(i=n[0];i>0;i--)
		fprintf(s,"%d",n[i]);
	
	fclose(s);
	
	return 0;
}