0

我无法让以下代码工作。

#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; 
}  

你怎样才能让代码工作?

4

7 回答 7

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! 很快变得非常大。

于 2009-05-09T12:16:02.420 回答
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 解释的原因,循环不会在您期望的地方停止。

于 2009-05-09T12:31:49.100 回答
3

void在定义或声明函数时省略 C 语言是不好的风格。所以放进去

int main(void)

虽然它不会改变函数的参数数量(该函数也有零参数void),但它会将函数声明为只接受零参数的函数,而不会告诉任何关于数量和省略void. 但是,有和没有的版本void都是正确的。

也请阅读有关该问题的答案

于 2009-05-09T13:53:40.503 回答
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;

}
于 2014-08-10T04:32:27.943 回答
1

你得到什么错误信息?

首先,factorial main. 另外,注意正确的缩进。顺便说一句,你的函数声明main是正确的。

于 2009-05-09T12:13:57.887 回答
1

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

double fact( double n)
{
   if ( n == 1)
        return 1;
   return n*(fact(n-1));
}
于 2009-05-09T12:36:47.480 回答
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;
}
于 2016-07-26T04:35:09.130 回答