数値が2の累乗かどうかを判定するC++プログラムの書き方
与えられた数値が2の累乗(べき乗)であるかどうかを判定する方法を紹介します。まず、どのような数が2の累乗に該当するのかを確認しておきましょう。基本的な考え方は、数値が偶数である間は繰り返し2で割り続け、最終的に1になれば2の累乗、それ以外の場合は2の累乗ではないと判定するというものです。
よりスマートな判定方法としては、数値の対数(log)を取る方法があります。底を2とした対数の計算結果が整数であれば、その数は2の累乗であり、整数でなければ累乗ではありません。2の累乗となる数は以下の通りです。
2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048 ...
22 = 4
25 = 32
210 = 1024
実際に入力と出力の例を見てみましょう。
入力:8
出力:Number is power of 2
判定ロジックの解説
シンプルな判定方法の一つ目は、数値の底2の対数を計算する方法です。計算結果が整数になれば、その数は2の累乗であると判断できます。
二つ目の方法は、Nが偶数である限りNを2で割り続けるというものです。除算を繰り返して最終的に1になった場合、Nは2の累乗であると判定できます。一方、途中で奇数になり1以外の値になった場合は、2の累乗ではありません。
C++による実装例
以下は、2で割り続ける方式を実装したC++のサンプルコードです。
#include <iostream>
using namespace std;
int main() {
int n = 8;
if(n > 0) {
// 偶数の間は2で割り続ける
while(n % 2 == 0) {
n /= 2;
}
if(n == 1) {
cout << "Number is power of 2" << endl;
}
}
if(n == 0 || n != 1) {
cout << "Number is not power of 2" << endl;
}
return 0;
}
コードの動作説明
このプログラムでは、まず数値nが正の値であるかを確認します。その後、nが偶数である間はwhileループ内で2による除算を繰り返します。例えばn=8の場合、8→4→2→1と変化し、最終的に1になるため「2の累乗である」と出力されます。逆にn=6の場合は6→3となり、1以外の奇数で処理が終わるため「2の累乗ではない」と判定されます。このアルゴリズムの計算量はO(log n)であり、非常に効率的です。
-
グリッド内で照らされているセルの数を求めるC++プログラム
問題の概要 ここでは、縦 h × 横 w のサイズを持つグリッドが与えられたとき、光で照らされているセルの数を求めるC++プログラムを紹介します。グリッドのセルには「電球」または「障害物」が置かれています。電球のあるセルは、そのセル自身と上下左右のセルを照らし、光は障害物に遮られない限りまっすぐ伝わっていきます。一方、障害物のあるセルは照らされることがなく、電球の光を遮って他のセルへ光が届かないようにします。電球の位置を配列 bulb、障害物の位置を配列 obstacles として受け取り、グリッド全体で照らされているセルの合計数を求めます。 たとえば、入力が h = 4、w = 4、bulb
-
Pythonで数値が2の累乗かどうかを判定するプログラム
本記事では、与えられた数値が2の累乗(べき乗)であるかどうかを判定する方法について、考え方と実装手順をわかりやすく解説します。 問題の定義 ある整数 n が与えられたとき、その数が2の累乗(1, 2, 4, 8, 16, …)であるかどうかを判定します。 アプローチ 判定には「繰り返し2で割る」というシンプルな方法を使います。考え方は以下の通りです。 入力された数値 n を、1になるまで繰り返し2で割っていきます(n = n // 2)。 割る過程で n % 2 の結果が0以外(奇数)になり、かつ n が1でない場合は、その数は2の累乗ではありません。 最終的に n がちょうど1になれば、そ