我无法使用以下代码。
#include <stdio.h>
// 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;
}
如何让代码生效?
答案 0 :(得分:15)
您正在修改循环内的循环终止变量(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!非常快速地变得非常大。
答案 1 :(得分:9)
AInitak给出了正确答案,但我想补充一点,您可以找到代码中的错误,打印出i
和x
的值在阶乘循环中。
int factorial(int x) {
int i;
for(i=1; i<x; i++)
{
x *= i;
printf("%d, %d\n", i, x);
}
return x;
}
这为您提供了输出
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解释的原因,循环不会停在您期望的位置。
答案 2 :(得分:3)
在定义或声明函数时忽略void
是C中的错误样式。所以把它放进去
int main(void)
虽然它没有改变函数所具有的参数数量(函数只有零参数而没有void
),但它会将函数声明为只接受零参数的函数,而它赢了当你省略void
时,不要说出被接受的参数的数量和类型。但是,包含和不包含void
的版本都是正确的。
关于此事也请阅读this answer。
答案 3 :(得分:2)
#include<stdio.h>
#include<stdlib.h>
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;
}
答案 4 :(得分:1)
您收到了什么错误消息?
首先,在 factorial
之前声明您的函数main
。另外,要注意正确的缩进。顺便说一下,你的函数声明main
是正确的。
答案 5 :(得分:1)
我建议使用double或unsigned long进行阶乘计算,以便能够计算出阶乘函数的更大值。
double fact( double n)
{
if ( n == 1)
return 1;
return n*(fact(n-1));
}
答案 6 :(得分:1)
更优雅的非递归函数。
#include<stdio.h>
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;
}