#include <stdio.h>
//varianta iterativa
int fact(int n) {
int p = 1;
for(int i = 1; i <= n; ++i) {
p *= i;
}
return p;
}
//1,2,3,4,5
//1*2*3*4*5
//[1,2,3] [4,5]
//[1,2],[3] [4][5]
void factorial_divide_et_impera(int lo, int hi, int *res) {
int a, b;
if(lo == hi) {
*res = lo;
} else {
int m = (lo + hi) / 2;
factorial_divide_et_impera(lo, m, &a);
factorial_divide_et_impera(m + 1, hi, &b);
*res = a * b;
}
}
int main(int argc, char const *argv[]) {
int n = 5;
//5! = 1 * 2 * 3 * 4 * 5
int res;
printf("5! = %d (varianta iterative clasica)\n", fact
(n
));
factorial_divide_et_impera(1, n, &res);
printf("5! = %d (divide et impera)", res
);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgovL3ZhcmlhbnRhIGl0ZXJhdGl2YQppbnQgZmFjdChpbnQgbikgewogICAgaW50IHAgPSAxOwogICAgZm9yKGludCBpID0gMTsgaSA8PSBuOyArK2kpIHsKICAgICAgICBwICo9IGk7CiAgICB9CiAgICByZXR1cm4gcDsKfQoKLy8xLDIsMyw0LDUKLy8xKjIqMyo0KjUKLy9bMSwyLDNdIFs0LDVdCi8vWzEsMl0sWzNdIFs0XVs1XQp2b2lkIGZhY3RvcmlhbF9kaXZpZGVfZXRfaW1wZXJhKGludCBsbywgaW50IGhpLCBpbnQgKnJlcykgewoKICAgICAgaW50IGEsIGI7CgogICAgICBpZihsbyA9PSBoaSkgewogICAgICAgICpyZXMgPSBsbzsKICAgICAgfSBlbHNlIHsKICAgICAgICAgaW50IG0gPSAobG8gKyBoaSkgLyAyOwogICAgICAgICBmYWN0b3JpYWxfZGl2aWRlX2V0X2ltcGVyYShsbywgbSwgJmEpOwogICAgICAgICBmYWN0b3JpYWxfZGl2aWRlX2V0X2ltcGVyYShtICsgMSwgaGksICZiKTsKICAgICAgICAgKnJlcyA9IGEgKiBiOwogICAgICB9Cn0KCmludCBtYWluKGludCBhcmdjLCBjaGFyIGNvbnN0ICphcmd2W10pIHsKCiAgaW50IG4gPSA1OwoKICAvLzUhID0gMSAqIDIgKiAzICogNCAqIDUKICBpbnQgcmVzOwoKICBwcmludGYoIjUhID0gJWQgKHZhcmlhbnRhIGl0ZXJhdGl2ZSBjbGFzaWNhKVxuIiwgZmFjdChuKSk7CgogIGZhY3RvcmlhbF9kaXZpZGVfZXRfaW1wZXJhKDEsIG4sICZyZXMpOwoKICBwcmludGYoIjUhID0gJWQgKGRpdmlkZSBldCBpbXBlcmEpIiwgcmVzKTsKCiAgcmV0dXJuIDA7Cn0=