Cod sursa(job #216531)

Utilizator mihaio07Oprea Mihai mihaio07 Data 24 octombrie 2008 19:54:16
Problema Cifra Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 1.88 kb
#include<stdio.h>


int stringlen (char *sir)           //strlen substitute
{
    int i=0;
    while (sir[i])
        i++;
    return i;
}

void invers (char *sir, int len)    //strrev substitute
{
    int i, man;
    for (i=0; i<=len/2; i++)
    {
        man=sir[i];
        sir[i]=sir[len-i];
        sir[len-i]=man;
    }
}

int citire (char *sir)
{
    int i, len;
    len=stringlen(sir)-2;
    for (i=0; i<=len; i++)
        sir[i]-='0';
    invers (sir, len);
    return len;       //pozitia ultimei cifre si nu lungimea numarului
}

void decrement (char *sir, int *len)
{
    int i=0;
    sir[i]--;
    while (sir[i]==-1)
    {
        sir[i]=9;
        i++;
        sir[i]--;
    }
    if ( i==(*len) && sir[i]==0 ) 
        (*len)--;
}

int construct4 (char *sir)  //ultimele 2 cifre pentru verificare restului la 4
{
    return (sir[0]+sir[1]*10);
}
    

int main()
{
    FILE *in, *out;
    char n[102];
    int valori[10][4]={{0},{0},{6,2,4,8},{1,3,9,7},{6,4,6,4},{0},{0},{1,7,9,3},{6,8,4,2},{1,9,1,9}};
    int ocifra[10]={0, 1, 4, 7, 6, 5, 6, 3, 6, 9};          //cifrele de la 1 la 9
    int i, L, ucif, putere, scif=0, nr, T, contor;
    in=fopen("cifra.in", "r");
    out=fopen("cifra.out", "w");

    fscanf(in, "%d", &T);
for (contor=1; contor<=T; contor++)
{   
    fgets( n,101,in );
    scif=0; 
    L=citire(n);   
    while (L>1)       //cat timp numarul are minim 2 cifre, ca sa mearga cu construct4
    {
        ucif=n[0];
        if (ucif==0 || ucif==1 || ucif==5 || ucif==6)
            scif+=ucif;
        else
        {
            putere=construct4(n)%4;
            scif+=valori[ucif][putere];
        }
        scif=scif%10;
        decrement(n,&L);
    }
    
    nr=n[0];
    for (i=1; i<=nr; i++)
        scif+=ocifra[i];
    scif=scif%10;
    
    fprintf(out, "%d", scif);
}
    
    return 0;
}