c语言 求阶乘

#include <stdio.h>
#include <stdlib.h>

int f(int n)
{
if(n==0||n==1) return 1;
return n*f(n-1);
}
int main()
{
int n,k,i;
scanf("%d",&k);
for(i=0;i<k;i++)
{
scanf("%d",&n);
printf("%d\n",f(n));
}
}
为什么输入20和20以上的数字的时候阶乘无法求出?输出是负数。

其实这个只能算到12的阶乘,因为13的阶乘等于6227020800,它已经大于2的31次方了,也就是超过了int所能表示的最大值了(溢出),所以你可以把int 改为double.

#include <stdio.h>
#include <stdlib.h>

double f(int n)
{
if(n==0||n==1) return 1;
return n*f(n-1);
}
int main()
{
int n,k,i;
printf("请输入一个数:");
scanf("%d",&k);
for(i=1;i<=k;i++)
{ printf("第%d个数为:",i);
scanf("%d",&n);
printf("%d!=%f\n",n,f(n));
}
}
我把你写的稍微改了一下,你看看。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-12-07
溢出了。32位int只能求13以内的阶乘。你把n定义成__int64型就能到20。
第2个回答  2014-12-07
13以上的阶乘,整数就不能表示了
16以上的阶乘,double就不能表示了!
要想表示20以上的阶乘,只能自己写大数乘法了!
第3个回答  2014-12-07
输入20以上时,数据已经溢出了。因为int为4个字节,最大正值为0x7FFFFFFF
第4个回答  2014-12-07
溢出了。20的阶乘应该是长整型。