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代わりにfor を使用する必要があります非常に急速に大きくなります。intx

于 2009-05-09T12:16:02.420 に答える
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

より洗練された非再帰関数。

#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 に答える
1

どのようなエラー メッセージが表示されますか?

まず、 のfactorial 前に main関数を宣言します。また、正しいインデントにも注意してください。ちなみに、関数の宣言mainは正しいです。

于 2009-05-09T12:13:57.887 に答える