Cod sursa(job #1457905)

Utilizator perjulucianPerju Lucian Ionut perjulucian Data 4 iulie 2015 20:27:58
Problema Cifra Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 3.91 kb
#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 ;
}