Cod sursa(job #2223351)

Utilizator arvlgeArdeleanu Vlad George arvlge Data 19 iulie 2018 20:55:12
Problema Cifra Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.78 kb
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>

typedef unsigned int uint;


#define RET(c,r) case c: return r

int lastDigitPow(int d,int p){
    switch(d){
        RET(0,0);
        RET(1,1);
        case 2:
            switch(p%4){
                RET(0,6);RET(1,2);
                RET(2,4);RET(3,8);
            }
        case 3:
            switch(p%4){
                RET(0,1);RET(1,3);
                RET(2,9);RET(3,7);
            }
        case 4:
            switch(p%2){
                RET(0,6);RET(1,4);
            }
        RET(5,5);
        RET(6,6);
        case 7:
            switch(p%4){
                RET(0,1);RET(1,7);
                RET(2,9);RET(3,3);
            }
        case 8:
            switch(p%4){
                RET(0,6);RET(1,8);
                RET(2,4);RET(3,2);
            }
        case 9:
            switch(p%2){
                RET(0,1);RET(1,9);
            }
    }
}

int _StrToNrDiv100(char*n){
    int len=strlen(n);
    switch(len){
        case 1:
        case 2:
            return atoi(n);
        default:
            return atoi(n+len-2);
    }
}

int main(){
    FILE*fi,*fo;
    int t,i,val;
    char n[121];
    uint v[100];
    v[0]=0;
    //precomputare
    for(i=1;i<=99;i++)
        v[i]=(v[i-1]+lastDigitPow(i%10,i))%10;
    //for(i=0;i<100;i++)
        //printf("v[%d]=%d%c",i,v[i],i%10==0?'\n':' ');
    fi=fopen("cifra.in","rt");
    fo=fopen("cifra.out","wt");
    fscanf(fi,"%d",&t);
    fgetc(fi);
    for(i=0;i<t;i++){
        fgets(n,121,fi);
        if(n[strlen(n)-1]=='\n')
            n[strlen(n)-1]=0;
        val=_StrToNrDiv100(n);
        fprintf(fo, "%d\n", v[val] );
    }
    fclose(fi);
    fclose(fo);
    return 0;
}