C++でnCr(組み合わせ)の値を計算するプログラム
本記事では、C++を使ってnCr(組み合わせ)の値を計算するプログラムを紹介します。ここで、Cは組み合わせ(Combination)を表し、nは全体の要素数、rはその集合から選び出す要素の数を意味します。
組み合わせとは?
組み合わせとは、与えられた集合から要素を選び出す際に、並び順を考慮しない選択方法のことです。よく混同されやすい「順列」との違いは、順列が要素の「並べ方」を扱うのに対し、組み合わせは単に「選び方」を扱うという点にあります。
例えば、{A, B, C} から2つを選ぶ場合、「AB」と「BA」は順列では別物ですが、組み合わせでは同じ1通りとして数えます。
nCrの計算式
n個の中からr個を選ぶ組み合わせの総数は、次の式で求められます。
nCr = n! / (r! × (n-r)!)
ここで「!」は階乗を表します。例えば 5! = 5 × 4 × 3 × 2 × 1 = 120 です。
入出力例
入力:n = 12, r = 4 出力:12c4 の値は : 495
アルゴリズム
開始
ステップ1 → 階乗を計算する関数を定義する
int cal_n(int n)
int temp = 1
int i = 2 から i <= n まで i を増やしながらループ
temp = temp * i を設定
ループ終了
temp を返す
ステップ2 → nCrを計算する関数を定義する
int nCr(int n, int r)
return cal_n(n) / (cal_n(r) * cal_n(n - r))
ステップ3 → main() 内で
変数 int n = 12, r = 4 を宣言
nCr(n, r) を出力
終了C++サンプルコード
#include <bits/stdc++.h>
using namespace std;
// nの階乗を計算する関数
int cal_n(int n){
int temp = 1;
for (int i = 2; i <= n; i++)
temp = temp * i;
return temp;
}
// nCrを計算する関数
int nCr(int n, int r){
return cal_n(n) / (cal_n(r) * cal_n(n - r));
}
int main(){
int n = 12, r = 4;
cout << "value of " << n << "c" << r << " is :" << nCr(n, r);
return 0;
}実行結果
value of 12c4 is :495
補足:大きな数を扱う場合の注意点
上記の実装はシンプルで分かりやすい反面、階乗の値が急激に大きくなるため、int型では n = 13 程度ですぐにオーバーフローしてしまいます。より大きなnを扱いたい場合は、以下の対策が有効です。
- データ型を
long longやunsigned long longに変更する - 乗算と除算を交互に行い、中間値が大きくなりすぎないようにする
- さらに大きな値が必要な場合は、多倍長整数ライブラリ(Boost.Multiprecisionなど)を利用する
競技プログラミングなどでは、答えを素数で割った余りを求める問題も多く、その場合は剰余演算を組み合わせた実装が一般的です。
-
sin(x)とcos(x)の値を計算するC++プログラムの解説
sin(x)とcos(x)の値を計算するC++プログラム 本記事では、角度を入力として受け取り、その角度に対応するsin(x)(正弦)とcos(x)(余弦)の値を計算して結果を表示するC++プログラムを解説します。ライブラリ関数に頼らず、テイラー展開(マクローリン展開)を用いて数値を近似する手法を紹介します。 sin(x)とは sin(x)は三角関数の一つで、角度xに対する正弦の値を求めるために使用されます。直角三角形では、斜辺に対する対辺の比として定義されます。 $$\sin (x) = \displaystyle\sum\limits_{k=0}^\infty \frac{(-1)^{k
-
C++で数値の累乗を計算する方法:再帰・非再帰プログラムの実装例
数の累乗とは数の累乗は x^y の形式で表され、x は基数(底)、y は指数を表します。例を見てみましょう。x = 2、y = 10 の場合 x^y = 1024 ここで、x^y は 2^10 を意味します数の累乗は、再帰的プログラムと非再帰的プログラムの2つの方法で計算できます。以下、それぞれの実装方法を詳しく解説します。非再帰プログラムによる累乗の計算まずは、forループを使用した非再帰的なプログラムの例です。サンプルコード#include<iostream>using namespace std;int power(int x, int y) { int i