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

【C++】不等式 x*x + y*y < n を満たす異なる非負整数ペア(x, y)を数える方法

正の整数 N が与えられたとき、不等式 x2 + y2 < N を満たす「異なる非負整数のペア (x, y)」の個数を数えることを考えます。

x = 0 から x2 < N の範囲、y = 0 から y2 < N の範囲でそれぞれの値を順に試していき、x2 + y2 < N が成り立つ組み合わせが見つかるたびにペアのカウントを1つ増やします。

例で確認しよう

入力: n = 4
出力: 異なるペア数 = 4
説明: 条件を満たすペアは (0,0)、(1,1)、(0,1)、(1,0) の4つです。いずれも不等式 x2 + y2 < 4 を満たしています。

入力: n = 2
出力: 異なるペア数 = 3
説明: 条件を満たすペアは (0,0)、(0,1)、(1,0) の3つです。いずれも不等式 x2 + y2 < 2 を満たしています。

プログラムで使用するアプローチ

  • 整数変数 N に、対象となる正の整数を格納します。
  • 関数 countPairs(int n) は n を引数として受け取り、不等式 x2 + y2 < n を満たす異なる非負整数ペアの個数を返します。
  • 変数 count に該当するペアの個数を保存します。初期値は 0 です。
  • 外側のループで i = 0 から i2 < n まで、内側のループで j = 0 から j2 < n まで繰り返します。
  • 各組み合わせについて i2 + j2 < n が成立していれば count をインクリメントします。
  • 処理が完了したら count を結果として返します。

コード例

#include <iostream>
using namespace std;
int countPairs(int n){
    int count = 0;
    for (int i = 0; i*i < n; i++)
        for (int j = 0; j*j < n; j++) // x*x + y*y < n
            if(i*i + j*j < n)
                count++;
    return count;
}
int main(){
    int N = 4;
    cout << "Distinct Non-Negative integer pairs count: " << countPairs(N);
    return 0;
}

出力結果

上記のコードを実行すると、以下のような出力が得られます。

Distinct Non-Negative integer pairs count: 4

計算量について

外側と内側のループはそれぞれ i2 < n、j2 < n の間だけ繰り返されるため、各ループは高々 √n 回しか実行されません。したがって全体の時間計算量は O(n) となり、必要な追加メモリは O(1) で済みます。条件を満たさない組み合わせを早めに除外することで、さらに効率化できる余地もあります。

  1. C++で配列内に合計値が存在する個別のペアの数をカウントする方法

    整数値からなる任意のサイズの配列 arr[] が与えられたとき、「その和も同じ配列内に存在する」個別のペアの数を計算するのが本記事のテーマです。 配列とは、同じ型の要素を固定サイズで連続的に格納できるデータ構造の一種です。データの集合を保持するために使われますが、実用上は「同じ型の変数の集まり」として捉えると理解しやすいことが多いでしょう。 押さえておくべきポイント ペアは要素の並び順にかかわらず、同じ組み合わせであれば1回のみカウントします。たとえば (3,2) と (2,3) は同一のペアとして1件と数えます。 配列内に複数回現れる値は、ペアを構成するうえでちょうど2つぶんまでしか考慮さ

  2. 【C++】「数値+逆順(数値)=10^N−1」を満たすN桁の数の個数を求める方法

    本記事では、指定された条件を満たすN桁の数値の個数を求めるプログラムについて解説します。具体的には、整数Nが与えられたとき、次の条件を満たすN桁の数値がいくつ存在するかを求めます。数値 + 逆順(数値) = 10N − 1例えばN = 4の場合、104 − 1 = 9999となるため、「数値とその逆順の和が9999になるような4桁の数」がいくつあるかを数えることになります。考え方この問題にはシンプルな数学的な性質があります。Nが奇数の場合: 条件を満たす数値は1つも存在しないため、答えは0になります。Nが偶数の場合: 各桁のペア(先頭と末尾、2桁目と末尾から2番目…)の和が必ず9になる必要があ