fork download
  1. // Factorial. (2.00)
  2.  
  3. #include <limits.h>
  4. #include <errno.h>
  5. #include <string.h>
  6. #include <stdio.h>
  7.  
  8. static inline _Bool mul_overflow(int a, int b, int *c)
  9. {
  10. if (a != 0 && INT_MAX/a < b)
  11. return 1;
  12. *c = a*b;
  13. return 0;
  14. }
  15.  
  16. int factorial(int n)
  17. {
  18. if (n < 0)
  19. {
  20. errno = EDOM;
  21. return -1;
  22. }
  23.  
  24. int result = 1;
  25.  
  26. while (n > 1)
  27. {
  28. if (mul_overflow(n, result, &result))
  29. {
  30. errno = ERANGE;
  31. return -1;
  32. }
  33. n -= 1;
  34. }
  35. return result;
  36. }
  37.  
  38. int main(void)
  39. {
  40. for (int i = -1; i < 14; i++)
  41. {
  42. int result = factorial(i);
  43. if (result < 0)
  44. printf("%2d! : %s\n", i, strerror(errno));
  45. else
  46. printf("%2d! = %d\n", i, result);
  47. }
  48. return 0;
  49. }
Success #stdin #stdout 0s 5320KB
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