【问题标题】:why it gives negative values when finding factorial in C?为什么在 C 中找到阶乘时会给出负值?
【发布时间】:2023-03-28 07:18:02
【问题描述】:
  • 我必须创建一个递归函数来找到从 1 到 30 的阶乘。
  • 阶乘值在 12 以内是正确的。从 13 开始,它给出了错误的值,其中一些是负数。
  • 我使用了“unsigned long long”,但没有用。
  • 我使用代码块作为编译器,所以我认为它最多只能处理 32 位整数。
  • 这是代码和输出。
#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

【问题讨论】:

  • 想想变量类型可以持有的值的范围。无符号 32 位可以容纳 4294967295 但 13!是6227020800
  • 同时启用编译器警告。将 int 传递给需要 unsigned long 的函数可能会发出警告。
  • @WeatherVane unsigned long long 最多可以使用 ~ 1.845 x 10^19 但它不起作用
  • 您未显示的代码不起作用。您必须与数据类型和格式说明符保持一致。 printf 将需要 %llu 用于 unsigned long long

标签: c recursion codeblocks factorial unsigned-long-long-int


【解决方案1】:

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

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 打印它。

【讨论】:

    【解决方案2】:

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

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

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

    正确的语法:

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

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

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

    【讨论】:

    • 谢谢.. 我在 printf 中犯了一个愚蠢的错误。我使用了 unsigned long long,现在它最多可以工作 20 个! .
    猜你喜欢
    • 2023-02-25
    • 2021-03-10
    • 1970-01-01
    • 2020-09-18
    • 2021-02-14
    • 1970-01-01
    • 2013-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多