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