C++でビット演算を使って整数に3.5を掛ける方法
n × 3.5 の結果を求めるには、(n × 2) + n + (n ÷ 2) を計算します。ビットを左に1ビットシフトすれば「n × 2」、右に1ビットシフトすれば「n ÷ 2」となり、これらをすべて加算することで結果が得られます。
n × 3.5 = (n × 2) + n + (n ÷ 2)
この式が正しいことは、さまざまな n の値を代入して確認できます。それでは、いくつか例を見てみましょう。
入力
2 7 10
出力
7 24 35
アルゴリズム
- 数値 n を初期化します。
- 左シフト演算子(<<)を使って n × 2 を求めます。
- 右シフト演算子(>>)を使って n ÷ 2 を求めます。
- 上記の2つの値と n 本身を加算して結果を計算します。
- 結果を返します。
以上の手順に従えば、非常にシンプルな問題として解くことができます。
実装
以下は、上記のアルゴリズムをC++で実装したものです。
#include <bits/stdc++.h>
using namespace std;
int getTheResult(int x) {
return (x << 1) + x + (x >> 1);
}
int main() {
int n = 10;
cout << getTheResult(n) << endl;
return 0;
}
出力
上記のコードを実行すると、次のような結果が出力されます。
35
-
【C++】バックトラッキングでグリッドの8つのマスに1〜8の数字を条件付きで配置する方法
この記事では、図の中にある8つの丸(マス)に「1」から「8」までの数字を、「数列上で隣り合う数字同士がグリッド上でも隣接しない」という条件を満たすように配置する問題を、C++で解く方法を解説します。問題の概要たとえば、入力として次のような3×4のグリッドが与えられたとします。「0」は使用しないマス、「-1」はまだ数字が置かれていない空きマスを表します。0-1-10-1-1-1-10-1-10この場合の出力は次のようになります。 3 5 7 1 8 2 4 6この結果では、たとえば「1」と「2」、「7」と「8」のように数列で連続する数字が、グリッド上で上下左右・斜めに隣り合わないように配置
-
C++で指定された値を持つ葉ノードを削除するアルゴリズム
問題の概要二分木と整数 target が与えられたとき、値が target と一致するすべての葉ノードを削除することを考えます。ここで重要なのは、葉ノードを削除した結果、その親ノードが新たに葉ノードになり、かつその値が target と一致する場合には、その親ノードも同様に削除しなければならないという点です。この操作は、削除できるノードがなくなるまで繰り返し行います。例えば、下図のような二分木があり、target が 2 の場合、最終的な木は次のようになります。解法のアプローチこの問題は、再帰を用いた後順(ボトムアップ)処理によって効率的に解くことができます。具体的な手順は以下の通りです。ルー