一道C语言求阶乘问题,不知道错哪了?

#include <stdio.h>
int fact(int n)
{
int i;
for(i=1;i<n;i++)

n*=(n-i);

return n;
}
int main(void)
{
int num;
scanf("%d",&num);
printf("该数的阶乘为%d",fact(num));
return 0;
}

输入3 输出一个绝对值很大的负数

因为n永远比i大,循环会一直做到数据溢出。换个变量来存或者比较。

追问

明白了~谢谢~

温馨提示:答案为网友推荐,仅供参考
第1个回答  2017-12-12

你的循环结束条件是 i >= n,然而你每次循环运算 n = n*(n-i),使得n越变越大

由于你的n是int型,因此当n超过int型上限(2^31 - 1)时,计算补码使得n变成负数,结束循环,此时你返回的n自然就是负数了,可以计算知道n = -921769440

下面给一个阶乘函数吧

//    建议使用DEVC++ 或 VS2017,别用1998年的VC6.0了,很多特性不支持 

int fact(int n)
{
    int sum = 1;
    for(int i = 1; i <= n; i++)    //VC6.0 请在前面定义 i  
        sum *= i;    
    return sum;
}

追问

嗯嗯明白了~没有注意循环条件...谢谢~

第2个回答  2017-12-12
n*=(n-i),第一个n用另外一个变量代替