fak.c
changeset 80 5d7057a1b202
parent 77 49e0babccb23
--- a/fak.c
+++ b/fak.c
@@ -6,14 +6,20 @@
 #include <stdio.h>
 #include <stdlib.h>
 
-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;
 }