为什么在 C 中找到阶乘时给出负值?

why it gives negative values when finding factorial in C?

#include <stdio.h>
#include <math.h>

unsigned long int factorial_rec(unsigned long n)
{
  if(n==1) return 1;
  else return factorial_rec(n-1) * n;
}

int main(int argc, char **argv)
{
  int i;

  for(i=1; i<30; i++)
    printf("%d! = \t%d\n", i, factorial_rec(i));

  return 0;
}

输出:-

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! =   1932053504
14! =   1278945280
15! =   2004310016
16! =   2004189184
17! =   -288522240
18! =   -898433024
19! =   109641728
20! =   -2102132736
21! =   -1195114496
22! =   -522715136
23! =   862453760
24! =   -775946240
25! =   2076180480
26! =   -1853882368
27! =   1484783616
28! =   -1375731712
29! =   -1241513984

你在这一行中犯了一个愚蠢的错误:

printf("%d! = \t%d\n", i, factorial_rec(i));

factorial_rec(i) 使用说明符 %lu 而不是 %d,您将不会再收到任何错误。

正确的语法:

printf("%d! = \t%lu\n", i, factorial_rec(i));

建议: 更好地使用:unsigned long long 修饰符以获得如此大的值的预期结果,并改用说明符 %llu

免责声明:该值可能是意外的,因为较大的数字会溢出。

主要问题是您如何打印结果:

printf("%d! = \t%d\n", i, factorial_rec(i));

%d 格式说明符需要一个 int 参数,但对于第二个参数,您要传递一个 unsigned long。使用错误的格式说明符调用 undefined behavior.

对于 unsigned long,您应该使用 %lu 作为格式说明符。但是,不能保证 unsigned long 足够大以容纳 64 位数字。为此,您应该使用 unsigned long long 作为数据类型,并使用 %llu 打印它。