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

C++で y mod 2^x(2のx乗)の値を求める方法


この問題では、2つの値 x と y が与えられ、y を 2 の x 乗(2x)で割った余りの値を求めることが課題となります。

具体例を見て、問題の内容を確認しましょう。

入力 : x = 2, y = 19
出力 : 3

解説 −

y % 2x = 19 % 22 = 19 % 4 = 3

解法のアプローチ

最もシンプルな解法は、pow() 関数を使って 2x の値を直接計算し、その後で y % 2x を求める方法です。

もうひとつの効率的なアプローチとして、対数(log)を活用する方法があります。y < 2x が成り立つ場合、割り算の余りは y 自身と等しくなります。この条件は次のように表せます。

log2y < x

さらに、long long 型で扱える最大ビット幅を考慮すると、x の最大値は 63 です。x がこれを超えると 2x はオーバーフローしてしまいますが、この場合 y は必ず 2x より小さくなるため、余りは y 自身と一致します。

以上を踏まえると、処理は次の3つのケースに分けられます。

if(log2(y) < x) -> return y
else if(x > 63) -> return y
else -> return (y % pow(2, x))

実装例

この解法の動作を示すサンプルプログラムは以下の通りです。

#include <bits/stdc++.h>
using namespace std;
long long int findModVal(long long int y, int x){
   if (log2(y) < x)
      return y;
   if (x > 63)
      return y;
   return (y % (1 << x));
}
int main(){
   long long int y = 82829;
   int x = 12;
   cout<<"y mod 2^x の値は "<<findModVal(y, x);
   return 0;
}

出力結果

y mod 2^x の値は 909
  1. C++で二分木の各階層における最大値を見つける方法

    二分木が与えられたとき、その木の各階層(レベル)ごとの最大値を求めることを考えます。例えば、次のような二分木があるとします。この場合、出力は [1, 3, 9] となります。ルート(最上位)の階層には「1」だけが存在するため、最大値は 1第1階層には「3」と「2」があり、最大値は 3第2階層には「5」「3」「9」があり、最大値は 9解決のためのアプローチこの問題は、再帰的な深さ優先探索(DFS) を使うことで簡潔に解くことができます。手順は以下の通りです。結果を格納するための配列 ans を定義します。再帰関数 solve() を定義します。この関数はツリーノードとレベル(初期値は 0)を引数

  2. C++で二分木の最下層・左端の値を求める方法

    二分木が与えられたとき、その木の最も深い行(最下層)における左端の値を求める問題を考えてみましょう。例えば、次のような二分木があるとします。 この場合、最下層は [7, 4] であり、その中で最も左にある要素は 7 なので、出力は 7 となります。 解法のアプローチ この問題は、深さ優先探索(DFS)を利用することでシンプルに解くことができます。ポイントは「必ず左側の子ノードから先に訪問する」ことです。こうすることで、それまでに到達した中で最も深いレベルへ最初に到達したノードが、自動的にそのレベルの左端のノードになります。 アルゴリズムの手順 最初に、答えを格納する ans と、現在の最大