Cod sursa(job #171331)

Utilizator gabitzish1Gabriel Bitis gabitzish1 Data 4 aprilie 2008 00:59:56
Problema Invers Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 kb
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int t, N, ok, poz;
char a[10001], b[10001];

int calcul()
{
	int i, j, k;
	i = poz; j = N - 1;

	while (1)
	{
		if (i == j) 
		{
			if (a[i] % 2 == 0) {ok = 1; break;}
			else break;
		}

		if (i + 1 == j)
		{
			if (a[i] == a[j] || a[i] == a[j] + 11) { ok = 1; break;}
			else break;
		}

		if (a[i] == a[j]) {i++; j--;}

		else if (a[i] == a[j] + 1)
		{
			a[i + 1] += 10;
			i++; j--;
		}

		else if (a[i] == a[j] + 10)
		{
			if (a[j] == 9) break;
			k = j - 1;
			while (k >= i)
			{
				if (a[k] == 0) a[k--] = 9;
				else {a[k]--; break;}
			}

			if (k == i) break;
			i++; j--;
		}

		else if (a[i] == a[j] + 11)
		{
			a[i + 1] += 10;
			k = j - 1;
			if (a[j] == 9) break;
			while (k >= i)
			{
				if (a[k] == 0) a[k--] = 9;
				else {a[k]--; break;}
			}
			if (k == i) break;
			i++; j--;
		}

		else break;
	}
	return 0;
}

int main()
{
	freopen("invers.in","r",stdin);
	freopen("invers.out","w",stdout);

	int i, viz;
	scanf("%d\n",&t);
	while (t--)
	{
		scanf("%s",a);
		N = strlen(a);
		ok = i = poz = 0;
		viz = 1;

		if (a[0] == '0') break;

		for (i = 0; i < N; i++) a[i] = a[i] - '0';

		if (N == 1) {if (a[0] % 2 == 0) ok = 1;}
		
		else if (N == 2) 
		{
			if (a[0] == a[1]) ok = 1;
			else if (a[0] == 1 && (a[0] * 10 + a[1]) % 2 == 0) ok = 1;
		}

		else 
		{
			if (a[0] == 1)
			{
				viz = 1;
				if (a[0] == 1 && a[N - 1] == 0) viz = 0;

				for (i = 0; i < N; i++) b[i] = a[i];

				a[1] += 10;
				poz = 1;

				calcul();

				if (!ok && viz)
				{
					poz = 0;
					for (i = 0; i < N; i++) a[i] = b[i];
					calcul();
				}
			}
			else calcul();
		}

		if (ok) printf("DA\n"); else printf("NU\n");
	}
	return 0;
}