Cの階乗プログラム:数の階乗を計算する方法は?



正の整数の階乗は、整数とその下のすべての整数の積です。 Cで階乗プログラムを書く方法を学びましょう。例:3! = 3 * 2 * 1

正の整数の階乗は整数とその下のすべての整数の積です。つまり、数nの階乗(nで表されます!)は次の式で与えられます。

n! = 1 * 2 * 3 * 4 *。 。 。 。 。 * n





0の階乗は1と定義されており、負の整数に対しては定義されていません。以下にリストされているそれを見つけるための複数の方法があります-

始めましょう。



Forループを使用した階乗

これは、数値の階乗を見つけるための最も簡単で簡単な方法です。最初にコードにアクセスしましょう–

#include int main(){int I、num、fact = 1 //最小値が1であるため、階乗を1として定義printf(「階乗を計算するための数値を入力してください」)scanf( '%d'、&num)if(num<0) //if the input is a negative integer { printf (“Factorial is not defined for negative numbers.”) } else { for(i=1i0, therefore fact value remains 1 { fact = fact * i // keeps on multiplying and storing in the value of factorial till the input integer is reached } printf(“Factorial of %d = %dn”, num, fact) } return 0 //since we have defined the main() method with a return value of integer type }

出力-

5の階乗= 120



説明 -

階乗が検出される数値が入力として取得され、変数に格納され、負であるかどうかがチェックされます。入力した整数が負の場合、適切なメッセージが表示されます。階乗の値は、最小値が1であるため、1になるように事前定義されています。forループは正の整数に対して実行されます(テスト条件が偽であり、事実がゼロのままである0を除く)。 forループでは、階乗の値に各整数が乗算され、入力数に達するまで連続して格納されます。たとえば、input = 5の場合、フローはforループに進み、次の手順が実行されます-

ファクト= 1、i = 1 –>ファクト= 1 * 1 = 1 –> i = 2
ファクト= 1、i = 2 –>ファクト= 1 * 2 = 2 –> i = 3
ファクト= 2、i = 3 –>ファクト= 2 * 3 = 6 –> i = 4
ファクト= 6、i = 4 –>ファクト= 6 * 4 = 24 –> i = 5
ファクト= 24、i = 5 –>ファクト= 24 * 5 = 120 –> i = 6

6> 5であるため、テスト条件はfalseになり、ループは終了します。階乗の値が表示されます。

Javaで一時的な意味は何ですか

階乗使用関数

このアプローチはモジュラーアプローチとして知られており、非常に効率的であるため、プログラミングにも従う必要があります。その利点の1つは、コードを変更する必要がある場合、完全なコードを変更する代わりに、関連する関数を変更するだけでよいことです。このアプローチを使用して数値の階乗を見つけるためのコードを以下に示します。

#include long factorial(int num)//整数値をパラメーターとして受け取り、int型の値を返す階乗を計算する関数{int i long fact = 1 for(i = 1 i<= num i++) fact = fact * i return fact //returns to function call } int main() //execution begins from main() method { int num printf('Enter a number to calculate its factorialn') scanf('%d', &num) if(num<0) //if the input is a negative integer { printf('Factorial is not defined for negative numbers.') } printf('Factorial of %d = %dn', num, factorial(num)) //call to factorial function passing the input as parameter return 0 } 

出力 - 5の階乗= 120

説明-

プログラムのロジックは同じですが、階乗を計算し、実行が開始されるメインメソッドに値を返すために異なる関数が使用される点が異なります。

再帰を使用した階乗

再帰は、関数がそれ自体を呼び出し、対応する関数が再帰関数と呼ばれるプロセスです。これは、基本条件と再帰呼び出しの2つの部分で構成されます。基本条件の解が提供されますが、基本解に到達して使用されるまで小さい値に変換することで、大きい値の解を解くことができます。

以下は、再帰を使用して階乗を見つけるためのコードです:-

#include int fact(int)//関数プロトタイプint main(){int num printf( '階乗が見つかる番号を入力してください:')scanf( '%d'、&num)if(num<0) { printf('ERROR. Factorial is not defined for negative integers') } printf('Factorial of %d is %d', num, fact(num)) //first call is made return 0 } int fact(int num) { if(num==0) //base condition { return 1 } else{ return(num*fact(num-1)) //recursive call } } 

出力 –階乗5 = 120

説明 -ユーザーが入力として5を入力し、main()メソッドでnumの値が5であるとします。フローがprintfステートメント(12行目)に入ると、fact(5)関数が呼び出されます。ここで、fact(5)の場合、numは0に等しくない5であるため、フローはelseステートメントに進み、returnステートメントで再帰呼び出しが行われ、fact(4)が行われます。このプロセスは、基本条件、つまりnum = 0に到達し、1が返されるまで繰り返されます。ここで、フローはfact(1)に移動し、そこから1(fact(1)num = 1)* 1(fact(0)から返された値)が返されます。このプロセスは、必要な値が得られるまで繰り返されます。

時間と空間の複雑さ–再帰V / S反復

再帰用-

について 時間の複雑さ 、階乗0が唯一の比較であることがわかっています。したがって、T(0)= 1です。他の数値の階乗の場合、プロセスには1つの比較、1つの乗算、1つの減算、および1つの関数呼び出しが含まれます。したがって、

T(n)= T(n-1)+3
= T(n-2)+6
= T(n-3)+9
=&hellip。
= T(n-k)+ 3k

T(0)= 1であり、k = nの場合、(n-k)= 0であることがわかっています。

したがって、T(n)= T(0)+ 3n
= 1 + 3n

したがって、コードの時間計算量はO(n)です。

について スペースの複雑さ、 スタックは呼び出しごとに作成され、その値が次のようになるまで維持されます。計算されて返されます。たとえば、n = 5の場合、次のスタックを維持する必要があります

f(5)-> f(4)-> f(3)-> f(2)-> f(1)-> f(0)

ご覧のとおり、値がであるf(0)の呼び出しに到達するまで、5つのスタックを維持する必要があります。既知であり、返されます。したがって、n階乗の場合、nスタックを維持する必要があります。したがって、スペースの複雑さO(n)です。上記の写真から、n = 5の場合、5つのスタックが必要になることも明らかです。維持されます。したがって、n階乗の場合、nスタックを維持する必要があります。したがって、空間の複雑さはO(n)です。

反復用-

について 時間計算量、 ループ内にはn回の反復があるため、時間計算量はO(n)です。

について スペースの複雑さ、 反復解法の場合、維持する必要があるスタックは1つだけであり、整数変数が使用されます。したがって、スペースの複雑さはO(1)です。

この記事は以上です。時間の複雑さとともに、Cの階乗プログラムの概念を理解していただければ幸いです。

フェイルセーフvsフェイルセーフ

ご不明な点がございましたら、「C言語の階乗プログラム」のコメント欄でお気軽にご質問ください。喜んでお答えいたします。