【问题标题】:Unable to calculate factorial , getting output as 0 in C无法计算阶乘,在 C 中输出为 0
【发布时间】:2020-07-04 16:35:03
【问题描述】:

尝试计算 65 的阶乘,得到正确的输出。任何大于 65 的结果都会导致输出 0。令人震惊,因为我使用的是 unsigned long int。有什么不妥?

代码:

#include <stdio.h>

void factorial(int unsigned long);
int main()
{
    int unsigned long num, result;
    printf("\nEnter number to obtain factorial : ");
    scanf("%ld", &num);
    factorial(num);
}
void factorial (int unsigned long x)
{
    register int unsigned long f = 1;
    register int unsigned long i;
    for (i=x;i>=1;i--)
        f= f*i;
    printf("\nFactorial of %lu = %lu\n",x,f);
}

【问题讨论】:

  • 虽然 C 允许您编写 int unsigned long,但经验丰富的程序员从不会这样写,而是使用 unsigned longunsigned long int
  • 关于命名的提示:使用单字母变量时,避免使用可能会提示错误类型名称的变量。例如,名称f 可能会导致您将变量视为float。随着您的代码变得更长或更复杂,这些事情变得更加重要。
  • 当你计算 65 时,你怎么知道你得到了正确的输出! ?
  • @M.NejatAydin 你说得对,我的代码生成的阶乘 65 的值是 9223372036854775808 ,与实际值相差甚远。

标签: c int long-integer factorial unsigned-integer


【解决方案1】:

你肯定没有得到 65 的正确结果! log2(65!) 刚刚超过 302 位(谷歌它),所以你需要一个至少 303 位的long int 才能正确计算。世界上没有一台计算机的 long int 超过 300 位(让我们看看这个答案是如何老化的!)。

在 64 位中可以计算的最大阶乘是 20! (大约是 2.4e18)。

【讨论】:

  • 那么,谷歌/任何其他在线计算器如何给出 20 以上任何数字的阶乘值?是否将 300+ 位分解为 64 的块,就像 64 位被分解为 32 位 CPU 一样?
  • 像我这样的菜鸟可以尝试实现类似的东西吗?
  • 好的,你可以使用GMP库:gmplib.org
【解决方案2】:

加上@JohnZwinck,unsigned long long (ULLONG_MAX) 类型的变量的最大值是 18446744073709551615。所以所有值都大于 20!会有一个垃圾值

您可以参考this了解更多信息。

【讨论】:

  • 这不是最大值,是最小最大值
  • 这不能回答问题。
猜你喜欢
  • 2021-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
  • 2010-11-25
  • 2013-02-19
相关资源
最近更新 更多