3
#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 了。

4

2 回答 2

6

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

尝试使用uint64_t(from <stdint.h>) 代替。

于 2013-01-18T00:47:48.460 回答
3

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

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

C FAQ 对整数大小有一个很好的概述:我应该如何决定使用哪种整数类型?您可能想要寻找一个任意精度的库。

否则,如果您只想近似更大的阶乘,也许您可​​以使用斯特林公式

于 2013-01-18T01:29:37.297 回答