Cod sursa(job #498014)

Utilizator antoanelaAntoanela Siminiuc antoanela Data 3 noiembrie 2010 20:59:07
Problema Invers Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <cstdio>
#define nmax 10010

char ss[nmax];
int n, l, v[nmax];

int main()
{
	freopen("invers.in","r",stdin);
	freopen("invers.out","w",stdout);
	scanf("%d\n",&n);
	int i, j, ok, tr, d, c, s, tn;
	for (i=1; i<=n; i++)
	{
		fgets(ss,nmax,stdin);
		for (l=1; ss[l-1]>='0' && ss[l-1]<='9'; l++) v[l]=ss[l-1]-'0';
		l--;
		ok=0;
		if (v[1]!=1 || (v[1]==1 && v[l]==1))
		{
			tr=0;
			ok=1;
			tn=0;
			for (s=1, d=l; s<=d; s++, d--) 
			{
				if (d==s) 
				{
					v[d]-=tr;
					tn=0;
					if (v[d]<0) v[d]=0;
					if (v[d]%2) ok=0;
					break;
				}
				c=tn*10+v[d];
				if (c==19) c=9;
				if (c>9 || (c==9 && tn==1))
				{
					v[d-1]--;
					if (v[d-1]<0) v[d-1]=9;
					tr=1;
				} else tr=0;
				tn=v[s]-c;
				if (v[s]<c) tn+=10;
				if (tn!=1 && tn) 
				{
					ok=0;
					break;
				}
				if (s+1==d && v[s]!=v[d]) ok=0;
			}
		}
		if (!ok) 
		{
			for (j=0; j<l; j++) v[j+1]=ss[j]-'0';
			if (v[1]==1 && l>1)
			{
				ok=1;
				tr=0;
				tn=1;
				for (s=2, d=l; s<=d; s++, d--) 
				{
					if (d==s) 
					{
						v[d]-=tr;
						tn=0;
						if (v[d]<0) v[d]=0;
						if (v[d]%2) ok=0;
						break;
					}
					c=tn*10+v[d];
					if (c==19) c=9;
					if (c>9 || (c==9 && tn==1))
					{
						v[d-1]--;
						if (v[d-1]<0) v[d-1]=9;
						tr=1;
					} else tr=0;
					tn=v[s]-c;
					if (v[s]<c) tn+=10;
					if (tn!=1 && tn) 
					{
						ok=0;
						break;
					}
					if (s+1==d && v[s]!=v[d]) ok=0;
				}
			}
		}
		if (ok) printf("DA\n"); else printf("NU\n");
	}
}