2017-04-03 7 views
0

次の質問では、いずれのコンパイラでも試した時間制限を超過しています(すべてオンラインコンパイラであっても問題ありません)。制限時間を超過している理由は何ですか?

#include <stdio.h> 
int fact(int); 
int main(void) 
{ 
    int num,res; 
    printf("enter any number"); 
    scanf("%d",&num); 
    res=fact(num); 
    printf("%d",res); 
    return 0; 
} 
int fact(int x) 
{ 
    int ans; 
    while(x!=1) 
     ans=(x*fact(x-1)); 
    return ans; 
} 
+0

これは入力によって大きく異なります。 –

+0

マシンにスタンドアロンコンパイラをインストールします。これはコンパイル時ではなく、実行時の問題です。あなたのプログラムはうまくコンパイルされますが、長い間実行されますが、これは入力内容によって異なります。 – ForceBru

答えて

4

問題whileループが終了することはありませんので、ごfact機能が停止したことがないということです。あなたの実際の機能は無限ループに入るので、それがある

int fact(int x) 
{ 
    int ans = 1; //Set default value for return 
    if(x!=1) //Go recursive only if X != 1 
     ans=(x*fact(x-1)); 
    return ans; 
} 
+0

ありがとう....しかし、あなたが何をした後でも、私は必要な出力を得ていないと言った。その時間制限メッセージは – user1712

+0

@ kabbyになりましたが、必要な出力の代わりに何を得ていますか? – JeremyP

+1

@kabby普通の32ビットの 'int'で計算できる最大の階乗は、12 – JeremyP

1

int fact(int x) 
{ 
    int ans; 
    while(x!=1) 
     ans=(x*fact(x-1)); //X is never changed! 
    return ans; 
} 

は、おそらくあなたはこれを望んでいました。

数値xの階乗を計算していると仮定すると、これは正しいファクト関数でなければなりません。

int fact(int x) 
{ 
    if(x!=1) 
     return x*fact(x-1); 
    return 1; 
} 
0
int fact(int x) 
{ 
    int ans; 
    while(x!=1) 
     ans=(x*fact(x-1)); 
    return ans; 
} 

それは無限ループです。時間制限を超えてエラーが発生するのは、このためです。 ループをif条件に置き換えます。

int fact(int x) 
{ 
    int ans = 1; 
    if(x!=1) 
     ans=(x*fact(x-1)); 
    return ans; 
} 
関連する問題