【Java】for文で階乗を計算する

【Java】for文で階乗を計算する

目次

階乗とは?

階乗(Factorial)は、数学で定義される関数であり、正の整数 n に対して、1 から n までの全ての整数を掛け合わせた値を求めるものです。記号「n!」で表されます。

例えば、以下のように計算されます:

  • 0! = 1 (定義)
  • 1! = 1
  • 2! = 2 × 1 = 2
  • 3! = 3 × 2 × 1 = 6
  • 4! = 4 × 3 × 2 × 1 = 24
  • 5! = 5 × 4 × 3 × 2 × 1 = 120

この計算は、for文を用いることで簡単に実装できます。

for文を使った基本的な実装

for文を使って階乗を求める方法の基本的な考え方は以下の通りです:

  1. 変数を用意し、結果を1に初期化する。
  2. for文を使って1からnまでの数字を掛け合わせる。
  3. 最終的な結果を返す。

具体的には、次のようなコードになります:


public class FactorialExample {
    public static void main(String[] args) {
        int n = 5; // 計算する階乗の値
        int factorial = 1;

        for (int i = 1; i <= n; i++) {
            factorial *= i;
        }

        System.out.println(n + "! = " + factorial);
    }
}

このプログラムを実行すると、5! = 120 が出力されます。

具体的なコード例

1から10までの階乗を求める


public class FactorialLoop {
    public static void main(String[] args) {
        for (int n = 1; n <= 10; n++) {
            int factorial = 1;
            for (int i = 1; i <= n; i++) {
                factorial *= i;
            }
            System.out.println(n + "! = " + factorial);
        }
    }
}

ユーザー入力に対応する


import java.util.Scanner;

public class FactorialInput {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("整数を入力してください: ");
        int n = scanner.nextInt();
        scanner.close();

        int factorial = 1;
        for (int i = 1; i <= n; i++) {
            factorial *= i;
        }

        System.out.println(n + "! = " + factorial);
    }
}

for文を使う際の制約と限界

for文を使った階乗計算にはいくつかの制約があります:

  • 整数型(int, long)では大きな値になるとオーバーフローが発生する。
  • 100! のような大きな値は、BigInteger を使わないと扱えない。
  • ループの回数が多くなると、処理時間が増加する。

例えば、以下のコードでは BigInteger を用いて 100! を計算できます:


import java.math.BigInteger;

public class FactorialBigInteger {
    public static void main(String[] args) {
        int n = 100;
        BigInteger factorial = BigInteger.ONE;

        for (int i = 1; i <= n; i++) {
            factorial = factorial.multiply(BigInteger.valueOf(i));
        }

        System.out.println(n + "! = " + factorial);
    }
}

応用的な実装

再帰を使った階乗計算

for文の代わりに、再帰を使って階乗を求めることもできます。


public class FactorialRecursive {
    public static int factorial(int n) {
        if (n == 0 || n == 1) return 1;
        return n * factorial(n - 1);
    }

    public static void main(String[] args) {
        int n = 5;
        System.out.println(n + "! = " + factorial(n));
    }
}

並列計算を利用する(応用)

より高速に計算するために、並列計算を活用する方法もあります。


import java.util.stream.IntStream;

public class FactorialParallel {
    public static void main(String[] args) {
        int n = 10;
        long factorial = IntStream.rangeClosed(1, n)
                                  .parallel()
                                  .reduce(1, (a, b) -> a * b);

        System.out.println(n + "! = " + factorial);
    }
}

まとめ

  • for文を使えば簡単に階乗を求めることができる。
  • 大きな数の階乗計算には BigInteger を使う。
  • 再帰を使う方法や並列計算も応用できる。
  • 入力を受け取るプログラムを作成すると、より柔軟に活用できる。

以上の知識を活用して、目的に応じた階乗計算プログラムを実装してみましょう!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です