Java
 Computer >> コンピューター >  >> プログラミング >> Java

JavaでnCr(組み合わせ)を計算するプログラムの書き方


この記事では、Javaを使ってn個の中からr個を選ぶ組み合わせ(nCr)を計算する方法を詳しく解説します。nCrとは「順序を考慮せずに、n個の要素からr個を選ぶ場合の数」を表すもので、以下の公式で求めることができます。

nCr = n! ÷ (r! × (n−r)!)

ここで「!」は階乗を意味します。例えば 5!(5の階乗)は 5×4×3×2×1 = 120 です。

実行例

入力

入力値が次のとおりだとします。

n の値 : 6
r の値 : 4

出力

期待される出力は次のとおりです。

nCr の値 : 15

実際に計算すると、6C4 = 6! / (4! × 2!) = 720 / (24 × 2) = 15 通りとなり、正しく求められていることがわかります。

アルゴリズム

ステップ1 - 開始する
ステップ2 - 整数型の変数 n と r を宣言する
ステップ3 - ユーザーから値を読み込む、または値を直接定義する
ステップ4 - 階乗を計算する関数と、公式 n!/(r!×(n−r)!) に従ってnCrを計算する関数を定義し、結果を保存する
ステップ5 - 結果を表示する
ステップ6 - 終了する

例1:ユーザーから入力を受け取る場合

この例では、Scannerクラスを使用して、プロンプトに従ってユーザーが値を入力します。

import java.util.*;
public class Combination {
   static int Compute_nCr(int n, int r){
      return my_factorial(n) / (my_factorial(r) *
      my_factorial(n - r));
   }
   static int my_factorial(int n){
      int i, my_result;
      my_result = 1;
      for (i = 2; i <= n; i++)
         my_result = my_result * i;
      return my_result;
   }
   public static void main(String[] args){
      int n,r;
      System.out.println("必要なパッケージをインポートしました");
      Scanner my_scanner = new Scanner(System.in);
      System.out.println("読み込み用オブジェクトを定義しました");
      System.out.print("nの値を入力してください : ");
      n = my_scanner.nextInt();
      System.out.print("rの値を入力してください : ");
      r = my_scanner.nextInt();
      System.out.println("入力された値に対する組み合わせの値は = " + Compute_nCr(n, r));
   }
}

出力

必要なパッケージをインポートしました
読み込み用オブジェクトを定義しました
nの値を入力してください : 6
rの値を入力してください : 4
入力された値に対する組み合わせの値は = 15

例2:値を事前に定義して使用する場合

この例では、nとrの値があらかじめ定義されており、その値を取得してコンソールに表示します。

public class Combination {
   static int Compute_nCr(int n, int r){
      return my_factorial(n) / (my_factorial(r) *
      my_factorial(n - r));
   }
   static int my_factorial(int n){
      int i, my_result;
      my_result = 1;
      for (i = 2; i <= n; i++)
         my_result = my_result * i;
      return my_result;
   }
   public static void main(String[] args){
      int n,r;
      n = 6 ;
      r = 4 ;
      System.out.println("nとrの値はそれぞれ " + n + " と " + r + " です");
      System.out.println("入力された値に対する組み合わせの値は = " + Compute_nCr(n, r));
   }
}

出力

nとrの値はそれぞれ 6 と 4 です
入力された値に対する組み合わせの値は = 15

補足:大きな値を扱う際の注意点

階乗は値が急激に大きくなるため、nがある程度大きくなるとint型ではオーバーフローが発生します。より大きな値を正確に扱いたい場合は、long型への変更や、任意精度の整数を扱えるBigIntegerクラスの活用を検討しましょう。


  1. 正方形の面積を求めるJavaプログラムの書き方【初心者向け解説】

    この記事では、Javaを使って正方形の面積を求める方法をわかりやすく解説します。正方形の面積は、次の公式で計算できます。辺 × 辺つまり s2正方形の面積の計算式正方形の1辺の長さを s とすると、その面積は s2(辺の2乗)で表されます。下図のように、縦と横が同じ長さの図形であるため、辺同士を掛け合わせるだけで面積が求まります。入力例1辺の長さ : 4出力例正方形の面積 : 16アルゴリズム処理の流れは以下の手順になります。Step 1 - 開始Step 2 - 整数型の変数 my_side(辺の長さ)と my_area(面積)を宣言するStep 3 - ユーザーから値を読み込む、または値を

  2. Javaで回文を判定するプログラムの書き方【数値・文字列の実例付き】

    回文(パリンドローム)とは、逆から読んでも同じになる文字列や数値のことです。たとえば、121、313、525 といった数値や、「aba」「wow」のような文字列が回文に該当します。この記事では、Javaを使って回文を判定する方法を、数値の場合と文字列の場合の2つのパターンに分けて、サンプルコードと実行結果とともにわかりやすく解説します。回文数をチェックする方法数値が回文かどうかを判定するには、元の数値を1桁ずつ取り出して逆順に組み立て直し、元の値と比較します。具体的には、剰余演算(%10)で末尾の桁を取り出し、それを結果変数に10倍しながら加算していくことで反転した数値を作れます。サンプルコー