Cod sursa(job #3301498)

Utilizator tavy_codingAlbuica Ioan Octavian tavy_coding Data 27 iunie 2025 01:36:08
Problema Cifra Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.36 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

#define MAX_SZ 101

int mod_2(char *s)
{
    return (int)s[strlen(s) - 1] % 2;
}

int mod_4(char *s)
{
    int l = strlen(s);
    if (l == 1) {
        return (s[l - 1] - '0') % 4;
    }
    
    int a = (s[l - 2] - '0') * 10 + (s[l - 1] - '0');
    return a % 4;
}

int find_last_digit(char *s, int b)
{
    if (b == 0 || b == 1 || b == 5 || b == 6) {
        return b;
    }
    if (b == 2 || b == 3 || b == 7 || b == 8) {
        int r = mod_4(s);
        if (r == 0) {
            r = 4;
        }
        return (int)pow(b, r) % 10;
    }
    if (b == 4 || b == 9) {
        int r = mod_2(s);
        if (r == 0) {
            r = 2;
        }
        return (int)pow(b, r) % 10;
    }
    return 0;
}

int sum_of_twenty(void)
{
    int nr = 0;
    for (int i = 0; i <= 19; i++) {
        if (i < 10) {
            char *s = (char *)malloc(2);
            s[1] = '\0';
            s[0] = i + '0';
            nr += find_last_digit(s, i);
            free(s);
        } else {
            char *s = (char *)malloc(3);
            s[0] = '1';
            s[1] = i % 10 + '0';
            s[2] = '\0';
            nr += find_last_digit(s, i);
            free(s);
        }
    }
    return nr;
}

int sum(char *s)
{
    int l = strlen(s), u, nr = 0;
    if (l == 1) {
        u = s[l - 1] - '0';
    }
    if (l > 1) {
        u = (s[l - 2] - '0') * 10 + (s[l - 1] - '0');
    }
    int r = u;
    u = u % 10;
    for (int i = 0; i <= u; i++) {
        if (i < 10) {
            char *c = (char *)malloc(2);
            c[1] = '\0';
            c[0] = i + '0';
            nr += find_last_digit(c, i);
            free(c);
        } else {
            char *c = (char *)malloc(3);
            c[0] = '1';
            c[1] = i % 10 + '0';
            c[2] = '\0';
            nr += find_last_digit(c, i);
            free(c);
        }
    }
    if (l == 1 || (l == 2 && s[0] == '1')) {
        return nr % 10;
    }
    return (nr + (r / 20) * sum_of_twenty()) % 10;
}

int main()
{
    FILE *file_in = fopen("cifra.in", "r");
    FILE *file_out = fopen("cifra.out", "w");
    int t;
    fscanf(file_in, "%d", &t);
    for (int i = 0; i < t; i++) {
        char *s = (char *)calloc(MAX_SZ, 1);
        fscanf(file_in, "%s", s);
        fprintf(file_out, "%d\n", sum(s));
        free(s);
    }

    fclose(file_in);
    fclose(file_out);
}