无法在C中使用阶乘函数

我无法使用以下代码。

#include  // I am not sure whethere I should void here or not. int main() { // when the first bug is solved, I put here arg[0]. It should be // similar command line parameter as args[0] in Java. int a=3; int b; b = factorial(a); // bug seems to be here, since the %1i seems to work only in fprintf printf("%1i", b); return 0; } int factorial(int x) { int i; for(i=1; i<x; i++) x *= i; return x; } 

你怎么能让代码工作?

AInitak给出了正确的答案,但我想补充一点,你可以找到代码中的错误,就是在阶乘循环中打印出ix的值。

 int factorial(int x) { int i; for(i=1; i 

这为您提供输出

 1, 3 2, 6 3, 18 4, 72 5, 360 6, 2160 7, 15120 8, 120960 9, 1088640 10, 10886400 11, 119750400 12, 1437004800 13, 1501193216 14, -458131456 -458131456 

这样可以更容易地看出出了什么问题。 由于AInitak解释的原因,循环不会停在您期望的位置。

您正在修改循环内的循环终止变量(x)。 目前你的代码在几次迭代后爆炸,当x溢出32位整数的范围然后变为负数且非常大时,因此终止循环。

它应该是:

 int factorial(int n) { int i, x = 1; for (i = 2; i <= n; ++i) { x *= i; } return x; } 

更好的是,你应该使用long而不是int作为变量x和返回值,因为n! 变得非常快。

在定义或声明函数时,在C中忽略void是不好的。 所以把它放进去

 int main(void) 

虽然它没有改变函数所具有的参数数量(该函数没有该参数的零参数),但它会将该函数声明为只接受零参数的函数,而它不会告诉任何有关金额的信息。省略void时接受的参数类型。 但是,有和没有void两个版本都是正确的。

关于这件事也请阅读这个答案 。

 #include #include int main(int c,char *v[]) { int x,y; int *num; if(c==1) { printf("Usage : programName : number"); return 0; } num=(int *)malloc(sizeof(int)); *num=atoi(v[1]); x=1;y=1; while(x<=*num) { y=y*x; x++; } printf("Factorial of %d is %d ",*num,y); free(num); return 0; } 

您收到了什么错误消息?

首先, main 之前声明你的函数factorial 。 另外,要注意正确的缩进。 顺便说一下,你的functionmain声明是正确的。

我建议使用double或unsigned long进行阶乘计算,以便能够计算阶乘函数的更大值。

 double fact( double n) { if ( n == 1) return 1; return n*(fact(n-1)); } 

更优雅的非递归function。

 #include long long int fact(long long int); long long int fact(long long int n){ long long int num = 1; long long int fi = 0; for(long long int i=2;i<=n;i++){ for(long long int j=1;j<=i;j++){ fi += num; } num = fi; fi = 0; } return num; } int main(){ long long int n; scanf("%lld",&n); printf("%lld\n",fact(n)); return 0; }