Cod sursa(job #69452)

Utilizator Binary_FireFlorin Pogocsan Binary_Fire Data 3 iulie 2007 02:04:54
Problema Sarpe Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <cstdio>
#include <string>
#include <algorithm>
#define fin  "sarpe.in"
#define fout "sarpe.out"
#define Cmax 1000000

using namespace std;

int a[Cmax],b[1001];

void read(int a[])
{
	int i;
	char buff;
	buff=getc(stdin);
	a[0]=0;
	while (buff!='\n' && buff!=EOF) 
	{
		if (buff >= '0' && buff <='9')
			a[++a[0]]=buff-'0';
		buff=getc(stdin);
	}
	for (i=1;i<=a[0]/2;++i)
		swap(a[i],a[a[0]-i+1]);
}

void mults(int a[],int b)	// mare cu mic
{
	int i,t=0;
	for (i=1;i<=a[0] || t;++i,t/=10) 
		a[i]=(t=a[i]*b+t)%10;
	a[0]=i-1;
}

void multb(int a[],int b[])	//mare cu mare
{
	int i,j,t,c[Cmax];
	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 adds(int a[],int b)
{
	int i,t=0;
	a[1]+=b;
	for (i=1;a[i]>9;++i)
	{
		a[i]%=10;
		++a[i+1];
	}
	if (i>a[0]+1) a[0]=i-1;
}

void sub(int a[],int b[]) 	
{
	int i,t=0;
	for (i=1;i<=a[0];++i) 
	{	
		if (i>b[0]) b[i]=0;
		a[i]=a[i]-t-b[i];
		if (a[i]<0) 
		{
			a[i]+=10;
			t=1;
		}
		else
			t=0;
	}
	for (;a[a[0]]==0 && a[0]>1;--a[0]);
}

void print(int a[]) 
{
	int i;
	for (i=a[0];i>0;--i)
		printf("%d",a[i]);
	printf("\n");
}

int main() 
{
	freopen(fin,"r",stdin); 
	freopen(fout,"w",stdout);

	read(b); 
	memcpy(a,b,sizeof(b));
	multb(a,a);
	sub(a,b);
	adds(a,2);
	mults(a,2);

	print(a);	

	return 0;
}