C++で指定範囲内のAまたはBで割り切れる数の個数を数える方法
4つの整数 L、R、A、B が与えられます。この問題の目的は、範囲 [L, R] 内に存在する、A または B(あるいはその両方)で割り切れる数の個数を求めることです。
解き方はシンプルで、L から R まで順番に走査し、各数値について「number % A == 0」または「number % B == 0」が成り立てばカウントを1つ増やしていきます。
具体例を使って理解を深めましょう。
入力 − L=10, R=15, A=4, B=3
出力 − A または B で割り切れる数の個数 − 2
説明 −
数値 12 は 3 と 4 の両方で割り切れます。 数値 15 は 3 でのみ割り切れます。 合計個数 = 2
入力 − L=20, R=30, A=17, B=19
出力 − A または B で割り切れる数の個数 − 0
説明 − 20 から 30 の間には、A または B(あるいはその両方)で割り切れる数は1つも存在しません。
プログラムで使用するアプローチ
- 4つの変数 A、B、L、R を用意します。
- 関数 countDivisors(int l, int r, int a, int b) はこれらすべてを引数として受け取り、範囲 [L, R] 内にある A または B(あるいはその両方)で割り切れる数の個数を返します。
- カウントの初期値を 0 に設定します。
- i = L から i = R までループし、i % a == 0 または i % b == 0 が成り立てばカウントを1つ増やします。
- ループが終了した時点のカウントが、A または B で割り切れる数の個数となります。
- カウントを結果として返します。
コード例
#includeusing namespace std; int countDivisors(int l, int r, int a,int b){ int count = 0; for (int i = l; i <= r; i++){ if(i%a==0 || i%b==0) { count++ ; } } return count; } int main(){ int L=5; int R=15; int A=2; int B=5; cout < 出力
上記のコードを実行すると、次のような出力が得られます −
Total divisors of A and B : 7
-
C++で文字列内のすべての回文部分列を数える方法
このチュートリアルでは、与えられた文字列の中に含まれる回文部分列の総数を求めるプログラムについて解説します。 入力として1つの文字列が与えられ、その文字列から作り出せる回文部分列がいくつあるかを数えるのが課題です。 回文部分列とは? 部分列(subsequence)とは、元の文字列から0個以上の文字を削除し、残りの文字の順序を保ったまま作られる文字列のことです。このうち、前から読んでも後ろから読んでも同じになるものを回文部分列と呼びます。 例として、文字列「abcb」を考えてみましょう。この文字列には次の6つの回文部分列が存在します。 a b(先頭) c b(末尾) bb(先頭と末尾のb)
-
C++で指定されたXOR値を持つペアの数を効率的にカウントする方法
このチュートリアルでは、配列の中から指定されたXOR値を持つペアの数を求めるプログラムについて解説します。具体的には、整数の配列とターゲットとなる値が与えられ、その2つの要素のXOR(排他的論理和)がターゲット値と一致するペアがいくつ存在するかをカウントするのが課題です。アルゴリズムの考え方全てのペアを総当たりで調べる方法(O(n²))もありますが、ここではハッシュマップ(unordered_map)を活用することで、時間計算量O(n)で効率的に解く手法を紹介します。基本的なアイデアは以下の通りです。XORの性質を利用します。ある要素 a に対して「a ^ b = x」が成り立つとき、「b =