Cod sursa(job #171969)

Utilizator plastikDan George Filimon plastik Data 5 aprilie 2008 15:24:37
Problema Cifra Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1 kb
#include <cstdio>
#include <cstring>

void div(char A[], int B) {
	int i, t = 0;
	for (i = A[0]; i > 0; i--, t %= B)
		A[i] = (t = t * 10 + A[i]) / B;
	for (; A[0] > 1 && !A[A[0]]; A[0]--);
}


int mod(char A[], int B) {
	int i, t = 0;
	for (i = A[0]; i > 0; i--)
		t = (t * 10 + A[i]) % B;
	return t;
}

const int PreDef[] = {0, 1, 5, 12, 18, 23, 29, 32, 38, 47, 47, 48, 54, 57, 63, 68, 74, 81, 85, 94};
const int NMAX = 128;
char Tmp[NMAX], Num[NMAX];

int main() {
	
	freopen("cifra.in", "r", stdin);
	freopen("cifra.out", "w", stdout);
	
	int t, i, aux, ans;
	for (scanf("%d", &t); t > 0; -- t) {
		scanf("%s", Num + 1);
		Num[0] = strlen(Num + 1);
		for (i = 1; i <= Num[0]; ++ i)
			Num[i] = Num[i] - '0';
		for (i = 1; i <= Num[0] / 2; ++ i) {
			aux = Num[Num[0] - i + 1];
			Num[Num[0] - i  + 1] = Num[i];
			Num[i] = aux;
		}
		
		memmove(Tmp, Num, sizeof(Num));
		div(Num, 20);
		ans = (4 * Num[1]) % 10;
		
		aux = mod(Tmp, 20) % 10;
		ans += PreDef[aux] % 10;
		
		printf("%d\n", ans % 10);
	}
	
	return 0;
}