Cod sursa(job #147358)

Utilizator MarquiseMarquise Marquise Data 2 martie 2008 20:35:50
Problema Sarpe Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <stdio.h>
#include <string.h>

#define NMAX 5000

int n, a[NMAX], c[NMAX], d[NMAX];

char s[NMAX];


void inmultire(int a[])
{
	int i, j, t;
	for ( i = 1; i <= a[0]; i++)
	{
		for ( t = 0, j = 1; j <= a[0] || t; j++, t /= 10)
			c[ i + j - 1] = ( t += c[i + j - 1] + a[i] * a[j]) % 10;
		if ( i + j - 2 > c[0])
			c[0] = i + j - 2;
	}

}

void scade(int c[], int a[])
{
	int i, t = 0;

	for ( i = c[0]; i >= 1; i--)
		c[i] += ( t = (c[i] -= a[i] + t) < 0) * 10;

	for ( ; c[0] > 1 &&  c[c[0]] == 0;  c[0]--);
}


void aduna(int c[], int x)
{
	int i, t = 0;

	c[1] += x;
	t = c[1] / 10;
	c[1] = c[1] % 10;
	for ( i = 2; i <= c[0] || t; i++, t /= 10)
		c[i] = ( t += c[i] ) % 10;

   c[0] = i - 1;
}

void inmulti(int c[], int x)
{
	int i, t = 0;
	for (i = 1; i <= c[0] || t; i++, t /= 10)
		d[i] = ( t += c[i] * x ) % 10;
	d[0] = i - 1;
}




int main()
{
	int i;

	freopen("sarpe.in", "r", stdin);
	freopen("sarpe.out", "w", stdout);
	scanf("%s", s);
	n = strlen(s);
	for ( i = n - 1; i >= 0; i--)
		a[++a[0]] = s[i] - '0';
	if (a[0] == 1 && a[a[0]] == 1)
		printf("1\n");
	else
	{

		inmultire(a);
		scade(c, a);
		aduna(c, 2);
		inmulti(c, 2);

		for ( i = d[0]; i >= 1; i--)
			printf("%d", d[i]);
		printf("\n");
	}

	return 0;
}