fork(1) download
  1. // Factorial.
  2.  
  3. #include <string.h>
  4. #include <errno.h>
  5. #include <stdio.h>
  6.  
  7. int factorial(int n)
  8. {
  9. if (n < 0)
  10. {
  11. errno = EDOM;
  12. return -1;
  13. }
  14.  
  15. int result = 1;
  16.  
  17. while (n > 1)
  18. {
  19. if (__builtin_mul_overflow(n, result, &result))
  20. {
  21. errno = ERANGE;
  22. return -1;
  23. }
  24. n -= 1;
  25. }
  26. return result;
  27. }
  28.  
  29. int main(void)
  30. {
  31. for (int i = -1; i < 14; i++)
  32. {
  33. int result = factorial(i);
  34. if (result < 0)
  35. printf("%2d! : %s\n", i, strerror(errno));
  36. else
  37. printf("%2d! = %d\n", i, result);
  38. }
  39. return 0;
  40. }
Success #stdin #stdout 0.01s 5284KB
stdin
Standard input is empty
stdout
-1! : Numerical argument out of domain
 0! = 1
 1! = 1
 2! = 2
 3! = 6
 4! = 24
 5! = 120
 6! = 720
 7! = 5040
 8! = 40320
 9! = 362880
10! = 3628800
11! = 39916800
12! = 479001600
13! : Numerical result out of range