[shkola] Towa e source-a na programata za faktoriala

Ponezhe Ludo mi iskashe source na zadachata za faktoriala, wi go 
prashtam i na was. Kojto uspee da razgadae algoritxma - dobre, inache 
shte wi go obqsnq sledwashtiqt pxt na shkolata.

Ludo, ako wersiqta, koqto imash na onazi zadacha ot kontrolnoto e 
podhodqshta za e-mail - prati q(za uslowieto stawa wxpros).

-- 
Ivaylo Riskov <ivaylo_riskov@xxxxxxx>

"If it happens, it must be possible."


#include <stdio.h>

int get_power(int n, int x) {
        int s = 0;
        int y;
        
        y = x;
        while (n >= y) {
                s += n/y;
                y *= x;
        }

        return s;
}

int calc(int r) {
        int c;
        int r1;

        r1 = r/10;

        if (r1%2)
                c = 9;
        else
                c = 1;

        r1 = r - r1*10;
        if (r1 >= 3) c *= 3;
        if (r1 >= 7) c *= 7;
        if (r1 >= 9) c *= 9;

        return c%10;
}

int solve(int n) {
        int p2, p5;
        int a, b;
        int last;
        
        p2 = get_power(n, 2);
        p5 = get_power(n, 5);
        if (p5 > p2)
                return 5;
        
        last = 1;
        for (b = 1; b < n; b *= 5)
                for (a = 1; a*b < n; a <<= 1) {
                        last *= calc(n/(a*b));
                        last %= 10;
                }

        if (p2 > p5) {
                p2 -= p5;
                switch (p2%4) {
                        case 0: last *= 6; break;
                        case 1: last *= 2; break;
                        case 2: last *= 4; break;
                        case 3: last *= 8; break;
                }
                last %= 10;
        }
        return last;
}

int main() {
        int n, m;
        
        while (scanf("%i", &n) == 1)
                printf("%i\n", solve(n));
        return 0;
}

Other related posts: