【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に初期化する。
- for文を使って1からnまでの数字を掛け合わせる。
- 最終的な結果を返す。
具体的には、次のようなコードになります:
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 を使う。
- 再帰を使う方法や並列計算も応用できる。
- 入力を受け取るプログラムを作成すると、より柔軟に活用できる。
以上の知識を活用して、目的に応じた階乗計算プログラムを実装してみましょう!