Cod sursa(job #171336)

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

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

void calcul()
{
	int i, j, k;
	i = poz; j = N - 1;
	while (1)
	{
		if (i == j) 
		{
			if (!(a[i] % 2)) {ok = 1; break;}
			else break;
		}

		if (i == j - 1) 
		{
			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)
		{
			i++; 
			j--;
			a[i] += 10;
		}
		else if (a[i] == a[j] + 10)
		{
			if (a[j] == 9) break;
			k = j - 1;
			while (k >= i) 
			{
				if (!a[k]) a[k--] = 9;
				else {a[k]--; break;}
			}
			if (k == i) break;
			i++; j--;
		}
		else if (a[i] == a[j] + 11)
		{
			if (a[j] == 9) break;
			a[i + 1] += 10;
			k = j - 1;
			while (k >= i)
			{
				if (!a[k]) a[k--] = 9;
				else {a[k]--; break;}
			}
			if (k == i) break;
			i++; j--;
		}
		else break;
	}
}


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

	int i, viz;
	scanf("%d\n",&T);

	while (T--)
	{
		ok = i = poz = 0;

		scanf("%s",a);
		N = strlen(a);

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

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

		if (N == 1) {if (!(a[0] % 2)) ok = 1;}
		else if (N == 2)
		{
			if (a[0] == a[1] || (a[0] == 1 && !(a[1] % 2))) ok = 1;
		}
		else
		{
			if (a[0] == 1)
			{
				viz = 1;
				if (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;
}