因子计算在我的C程序中是不正确的?

时间:2013-01-18 00:41:40

标签: c factorial

#include <stdio.h>
#include <conio.h>

int main()
{
  long signed fact=1;

  int c, n ;

  printf("Factorial to be calculated: ");
  scanf("%d", &n);

  for (c = 1; c <= n; c++)
  fact = fact * c;

  printf("Factorial of %d = %ld\n", n, fact);
  getch();
  return 0;
}

在上面的C程序中,当我跑步时,我无法得到13!正确。它的输出是真的12.如何解决这个问题? 我认为长期无条件就足够了13。

2 个答案:

答案 0 :(得分:6)

您的平台上long可能是32位(您可以通过打印sizeof(long)的值来查找)。 13!大于2 ^ 32-1(32位无符号值的最大可能值),因此溢出。

尝试使用uint64_t(来自<stdint.h>)。

答案 1 :(得分:3)

Oli说的是正确的 - C标准保证long至少为32位。在某些平台上可能更多。

您可以使用unsigned long long。这至少是64位,但它仍然只能让你计算最多20位!

C FAQ对整数大小有一个很好的概述:How should I decide which integer type to use?你可能想要寻找一个任意精度的库。

否则,如果您只想近似更大的阶乘,也许您可​​以使用Stirling's formula