C++で和の方程式 x + y + z = n の非負整数解の個数を求める方法
このチュートリアルでは、和の方程式の非負整数解の個数を求めるプログラムをC++で作成します。
扱う方程式は x + y + z = n です。数値 n が与えられたとき、この方程式を満たす非負整数解(x, y, z がすべて 0 以上の整数)がいくつ存在するかを求めます。まずは具体例を見てみましょう。
入力
2
出力
6
この場合の解は以下の6通りです。
0 0 2 0 1 1 0 2 0 1 0 1 1 1 0 2 0 0
アルゴリズム
数値 n を初期化します。
解の個数を数える変数 count を 0 に初期化します。
3つの数値のすべての組み合わせを調べるため、三重のネストしたループを記述します。
現在の組み合わせが方程式を満たすかどうかを判定します。
方程式を満たしていれば、count を 1 増やします。
最後に count を返します。
実装
以下は、上記のアルゴリズムをC++で実装したコードです。
#include <bits/stdc++.h>
using namespace std;
int getEquationSolutionCount(int n) {
int count = 0;
for (int i = 0; i <= n; i++) {
for (int j = 0; j <= n - i; j++) {
for (int k = 0; k <= n - i - j; k++) {
if (i + j + k == n) {
count++;
}
}
}
}
return count;
}
int main() {
int n = 10;
cout << getEquationSolutionCount(n) << endl;
return 0;
}出力
上記のコードを実行すると、次の結果が得られます。
66
計算量について
このアプローチは三重ループを使用するため、時間計算量は O(n³) となります。n が小さい範囲では十分に高速ですが、n が大きくなると処理時間が増加します。
なお、この問題には数学的な性質も利用できます。x + y + z = n の非負整数解の個数は「重複組合せ」の公式 C(n+2, 2) = (n+1)(n+2)/2 で一意に求められるため、O(1) で計算することも可能です。ただし、全探索による実装はロジックの理解に役立つため、学習目的としては非常に有効です。
-
C++でフィボナッチ数列の2乗の総和を求める方法
フィボナッチ数列とはフィボナッチ数列とは、0から始まり「直前の2つの数の和が次の数になる」という規則に従う数学的な数列です。たとえば、最初の数が0、2番目の数が1であれば、その和である1が3番目の数となります。F0=0, F1=1これを漸化式で表すと次のようになります。Fn = Fn-1 + Fn-2F2 = F0 + F1 = 0 + 1 = 1さらに、1と1を足すと次の数は2になります。F1=1, F2=1F3 = F1 + F2 = 1 + 1 = 2したがって、フィボナッチ数列は以下のように続いていきます。0, 1, 1, 2, 3, 5, 8, 13, 21, 34, …フィボナッチ
-
【C++】アリコット数列の求め方と実装例をわかりやすく解説
アリコット数列とは アリコット数列(Aliquot Sequence)は、特殊な性質をもった数列です。数列はある整数から始まり、次の項は直前の項の真の約数(その数自身を除く約数)の総和として定義されます。 具体的な例で確認してみましょう。 入力 : 8 出力 : 8 7 1 0 解説 : 8 の真の約数は 4, 2, 1。その和は 7 7 の真の約数は 1。その和は 1 1 の真の約数は存在しないため、その和は 0 完全数・友愛数・社交数との関係 アリコット数列は、以下の3種類の特別な数と深い関わりがあります。 完全数:数列の長さが1(自分自身に戻る)となる数。例:6