2019.03.20
階乗
階乗とは
階乗とは1からnの全ての自然数の積のことで、
n!
と書きます。
n!は1~nの掛け算なので、
nx(n-1)x(n-2)x … 3x2x1
となります。n=0の場合、
0!=1
と定義されます。
また、nがマイナスの場合には計算できません。
次に、0!=1の理由について説明します。4の階乗から1の階乗の計算を順を追って見ていくと、
4!=4x3x2x1=24
3!=3x2x1=6
2!=2x1=2
1!=1=1
となります。
別の書き方をすると、
3!=4!÷4
2!=3!÷3
1!=2!÷2
と書け
n!=(n+1)!÷(n+1)
であることがわかります。
それでは0!はどうでしょう。
n!=(n+1)!÷(n+1)
に0を代入すると
0!=(0+1)!÷(0+1)=1÷1
となり、
0!=1
となることがわかります。
Javaソースコード - for文を使う
Factorial1.java
001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035 036 037 038 039 040 041 042 043 044 045 046 047 048 049
public class Factorial1 { // 階乗メソッド static int factorial( int n ) { // nがマイナスの場合、nを戻す if ( 0 > n ) return n; // nが1の場合、0を戻す(0!=1) if ( 0 == n ) return 1; // nが1以上の場合の処理 int ans = 1; for ( int i = 1; i <= n; ++ i ) { ans = ans * i; } // 結果を戻す return ans; } // メイン public static void main( String[] args ) { // 変数宣言 int n; // 階乗を求める値 // 入力した引数が1以上かを調べる if ( 1 > args.length ) { // 入力した引数が1未満の場合、使用方法を表示する System.out.println( "Factrial1 [階乗を求める値n]" ); return; } try { // 引数を変換し、変数nに代入 n = Integer.valueOf( args[ 0 ] ); } catch( NumberFormatException ne ) { System.out.println( "引数が不正です" ); return; } // 階乗メソッドの呼び出し n! int ans = factorial( n ); System.out.println( n + "の階乗は" + ans + "です" ); } }
コンパイル ソースコードが「ANSI」の場合
C:\talavax\javasample>javac -encoding sjis Factorial1.java
コンパイル ソースコードが「UTF-8」の場合
C:\talavax\javasample>javac Factorial1.java
実行
C:\talavax\javasample>java Factorial1 5
実行結果
5の階乗は120です
1つ目の引数に5を渡して、5!を求めています。
Javaソースコード - 再帰
Factorial2.java
001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035 036 037 038 039 040 041 042 043
public class Factorial2 { // 階乗メソッド(再帰版) static int factorial( int n ) { // nがマイナスの場合、nを戻す if ( 0 > n ) return n; // nが1の場合、0を戻す(0!=1) if ( 0 == n ) return 1; // factorialをfactorialメソッド内で呼ぶ(再帰) return n * factorial( n - 1 ); } // メイン public static void main( String[] args ) { // 変数宣言 int n; // 階乗を求める値 // 入力した引数が1以上かを調べる if ( 1 > args.length ) { // 入力した引数が1未満の場合、使用方法を表示する System.out.println( "Factrial1 [階乗を求める値n]" ); return; } try { // 引数を変換し、変数nに代入 n = Integer.valueOf( args[ 0 ] ); } catch( NumberFormatException ne ) { System.out.println( "引数が不正です" ); return; } // 階乗メソッドの呼び出し n! int ans = factorial( n ); System.out.println( n + "の階乗は" + ans + "です" ); } }
コンパイル ソースコードが「ANSI」の場合
C:\talavax\javasample>javac -encoding sjis Factorial2.java
コンパイル ソースコードが「UTF-8」の場合
C:\talavax\javasample>javac Factorial2.java
実行
C:\talavax\javasample>java Factorial2 5
実行結果
5の階乗は120です
1つ目の引数に5を渡して、5!を求めています。
以上です。