Cod sursa(job #135229)

Utilizator pikuAnca Miihai piku Data 13 februarie 2008 12:53:06
Problema Sarpe Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include<cstdio>
#include<cstring>
#define max 10010

int v[max];

void cit()
{
	char tmp[max];
	int i;
	scanf("%s", tmp+1);
	v[0] = strlen(tmp+1);
	for(i=1; i<=v[0]; i++)
		v[i] = tmp[v[0]-i+1]-'0';
}

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

void add(int A[], int B[])
{
	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 mulsc(int A[], 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[], int B[])
{
	int i, j, t, C[max];
	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 sub(int A[], int B)
{
	int i;
	A[1] -= B;
	if(A[1] < 0)
	{
		A[1] +=10;
		for(i=2;;i++)
			if(!A[i])
				A[i]=9;
			else
			{
				--A[i];
				return;
			}
	}
}

int main()
{
	freopen("sarpe.in", "r", stdin);
	freopen("sarpe.out", "w", stdout);
	cit();
	int b[max], c[max];
	memcpy(b, v, sizeof(v));
	memcpy(c, v, sizeof(v));

	mulsc(v, 4);
	sub(b, 1);
	mulsc(b, 2);
	sub(c, 2);
	mul(b, c);
	add(v, b);
	print(v);

	return 0;
}