diff --git a/fak.c b/fak.c --- a/fak.c +++ b/fak.c @@ -6,14 +6,20 @@ #include #include -unsigned long fak (short i) +unsigned long long fak (short i) { if (i == 0) return 1; - else if (i > 0) - return (i * fak (i - 1)); - else - return (i * fak (i + 1)); + + return (i * fak (i - 1)); +} + +long double bigfak (short i) +{ + if (i == 0) + return 1; + + return (i * bigfak (i - 1)); } int main (int argc, char **argv) @@ -26,12 +32,15 @@ return EXIT_FAILURE; } - if (number < 0) { - printf ("NUMBER FORMAT ERROR\n"); + if (number < 0 || number > 170) { + printf ("Range Error: %hd ! {0..170}\n", number); return EXIT_FAILURE; } - printf ("The faktorial of %d is %lu\n", number, fak (number)); + if (number > 20) + printf ("The factorial of %2d is %1.5Lg\n", number, bigfak (number)); + else + printf ("The factorial of %2d is %llu\n", number, fak (number)); return EXIT_SUCCESS; }