#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int last_digit[10][4]={
{0, 0, 0, 0},
{1, 1, 1, 1},
{6, 2, 4, 8},
{1, 3, 9, 7},
{6, 4, 6, 4},
{5, 5, 5, 5},
{6, 6, 6, 6},
{1, 7, 9, 3},
{6, 8, 4, 2},
{1, 9, 1, 9}
};
void printeaza(int lungime , int * numar){
int i ;
printf("\n");
for (i = lungime - 1; i>= 0 ; i--)
printf("%d",numar[i] );
printf("\n");
}
int compara(int lungime_a, int * numar_a , int lungime_b , int * numar_b){
if (lungime_a < lungime_b)
return -1 ;
if(lungime_a > lungime_b)
return 1;
int egale = 0; // pp ca sunt egale
int i ;
for ( i = lungime_a -1 ; i >= 0; i--){
if(numar_a[i] < numar_b[i])
return -1 ;
if(numar_a[i] > numar_b[i])
return 1 ;
}
return egale ;
}
int * diferenta_nr( int lungime_a , int * numar_a , int lungime_b , int * numar_b,int *lungime_fin,int * diferenta_fin){
int i ;
int transport = 0 ;
int temp_diferenta ;
int *diferenta = (int*)calloc(lungime_a , sizeof(int)); // mereu nr a va fi dat ca param mai mare in main
for (i = 0 ; i < lungime_b ; i++){
temp_diferenta = numar_a[i] - numar_b[i] + transport;
if(temp_diferenta < 0){
temp_diferenta = temp_diferenta + 10 ;
transport = -1 ;
}
else
transport = 0 ;
diferenta[i] = temp_diferenta ;
}
while ( i < lungime_a ){
temp_diferenta = numar_a[i] + transport ;
if(temp_diferenta < 0){
temp_diferenta = temp_diferenta + 10 ;
transport = -1 ;
}
else
transport = 0 ;
diferenta[i] = temp_diferenta ;
i ++ ;
}
while(diferenta[i-1] == 0)
i -- ;
int j ;
if ( i == 0)
i = 1 ;
*lungime_fin = i ;
diferenta_fin = (int*)malloc(i*sizeof(int));
for ( j = i-1 ; j>=0 ; j--)
diferenta_fin[j] = diferenta[j];
free(diferenta);
return diferenta_fin ;
}
int pow_last_digit(int lungime , int * numar){
int cifra = numar[0]; // conteaza doar ultima cifra nu si restul
if(cifra == 0 || cifra == 1 || cifra == 5 || cifra == 6)
return cifra ; // evident , stim ca 0 1 5 6 la orice putere vor avea ultima cifra pe ele insele
// acum avem nevoie de restul impartirii "numar" ului la 4
// 2 cazuri posibile l = 1 , l = > 2
if ( lungime == 1)
return last_digit[cifra][cifra%4];
return last_digit [cifra][(numar[0] + 10 * numar[1]) % 4];
}
int process(char * char_number){
int lungime = strlen(char_number);
// int a = (int)numar[lungime-1] - 48 ;
int * numar = (int*)malloc(lungime * sizeof(int));
int i ;
for (i = 0 ; i < lungime ; i++)
numar[i] = (int)char_number[lungime-1-i] - 48 ;
int * decrement = (int*)malloc(sizeof(int));
decrement[0] = 1 ;
int * stop = (int*)malloc(sizeof(int));
stop[0] = 0 ;
int s = 0 ;
while(compara(lungime,numar,1,stop) != 0){
// printeaza(lungime,numar);
s +=pow_last_digit(lungime,numar);
numar = diferenta_nr(lungime,numar,1,decrement,&lungime,numar);
}
return s % 10 ;
}
int main(){
FILE * in = fopen("cifra.in","r");
FILE * out = fopen("cifra.out","w");
int T ;
fscanf(in,"%d\n",&T);
// printf("%d\n",T );
int i ;
char * numar = (char*)malloc( 101 * sizeof(char));
for ( i = 0 ; i < T ; i++){
fscanf(in,"%s\n",numar);
int to_print ;
to_print = process(numar);
fprintf(out, "%d\n",to_print );
strcpy(numar,"");
}
free(numar);
fclose(in);
fclose(out);
return 0 ;
}