我是 C 的新手。我编写了这个程序来查找任何数字的阶乘。执行程序后,当我提供 33 作为输入时 - 我得到 2147483648 作为答案。如果我提供 34,我会得到 0 作为答案。
开始我的问题 - 为什么我得到 0 作为答案?我使用的数据类型范围为 0-4294967295。我得到 0 是因为这超出了 unsigned int 的范围吗?如果我想得到一个大数字作为输出,我应该使用哪种数据类型?
使用的编译器 - GCC 8.2.1
这是代码 -
#include<stdio.h>
#include<stdlib.h>
int fact(unsigned int n)
{
int result;
if(n==0 || n==1)
result=1;
else
result=n*fact(n-1);
return result;
}
int main()
{
unsigned int n,ans;
printf("Enter n:");
scanf("%u",&n);
ans=fact(n);
printf("Factorial of %u:%u",n,ans);
}
最佳答案
33!
实际上超出了 32 位 int
的范围,无论是有符号的还是无符号的。 12!
的值为 479001600,而 13!
的值为 6227020800
,因此您超出了 13 的范围!
。
另请注意,result
被定义为 int
,您从 fact
返回一个 int
。这意味着您最终会遇到调用 undefined behavior 的有符号整数溢出。 .这可以通过将两者的类型更改为 unsigned
来解决,尽管您仍然限于 12!
。
您可以尝试为您的类型使用 unsigned long long
。这将使您达到 20!
。如果你想要比那个更大的值,你需要使用一个 bigint 库,比如 GMP。
关于c - 下面是一个求一个数的阶乘的程序。为什么我得到 0 作为答案?我应该改用哪种数据类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54907222/