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

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) で計算することも可能です。ただし、全探索による実装はロジックの理解に役立つため、学習目的としては非常に有効です。

  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, …フィボナッチ

  2. 【C++】アリコット数列の求め方と実装例をわかりやすく解説

    アリコット数列とは アリコット数列(Aliquot Sequence)は、特殊な性質をもった数列です。数列はある整数から始まり、次の項は直前の項の真の約数(その数自身を除く約数)の総和として定義されます。 具体的な例で確認してみましょう。 入力 : 8 出力 : 8 7 1 0 解説 : 8 の真の約数は 4, 2, 1。その和は 7 7 の真の約数は 1。その和は 1 1 の真の約数は存在しないため、その和は 0 完全数・友愛数・社交数との関係 アリコット数列は、以下の3種類の特別な数と深い関わりがあります。 完全数:数列の長さが1(自分自身に戻る)となる数。例:6