【发布时间】:2016-03-09 23:34:33
【问题描述】:
它一直工作到 20,但如果输入 21,它会返回 1419745... 当 21 阶乘实际上是 51090942171709440000。我假设这是因为无符号长最大值,但是这个错误的数字在哪里(141.. .) 来自,我怎样才能让程序计算出更大数字的阶乘?
#include <stdio.h>
unsigned long fact(unsigned long input);
int main()
{
int input;
printf("Enter an integer to find the factorial of: ");
scanf(" %d", &input);
printf("The Factorial of %d = %lu\n" , input, fact(input));
return 0;
}
unsigned long fact(unsigned long input)
{
if (input == 0)
return 1;
else
return input * fact(input - 1);
}
【问题讨论】:
-
您系统上的
ULONG_MAX是什么? -
乘法溢出后,通常会留下最低有效部分,但它是二进制截断,而不是十进制截断,这就是该值看起来不合理的原因。有两种方法:使用大型 int 库,或者有时需要乘积的模数 - 通过在每次乘法后应用模数来将数字保持在限制范围内。
-
@CoolGuy
long long不必超过 64 位。在 OP 的计算机上,long已经是 64 位了。另一方面,int在任何系统上都不应超过 32 位。 -
@CoolGuy 事实上,这并不完全正确:
unsigned long应该是至少 32 位,unsigned long long应该是至少 64 位和sizeof(unsigned long long) >= sizeof(unsigned long)。所以unsigned long long和unsigned long具有相同的大小并存储相同的值并非不可能 -
各种整数类型的数值限制是学习任何编程语言时最先讨论的问题之一。这通常在任何编程语言的初学者级编程书籍的第 1 章或第 2 章中讨论。
标签: c long-integer unsigned factorial