#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。
答案 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。