C++で与えられた整数が4の累乗かどうかを判定する方法
この問題では、整数 N が与えられ、その整数が4の累乗(べき乗)であるかどうかを判定することが求められます。
問題の例
入力:N = 64 出力:Yes
解説:
43 = 64
64 は 4 を3回掛け合わせた数、つまり4の累乗なので「Yes」が出力されます。
解法のアプローチ
最もシンプルな解き方は、数値を繰り返し4で割っていく方法です。具体的な手順は以下の通りです。
- 数値が0の場合は4の累乗ではないため false を返します。
- 数値が1になるまでループを続け、各段階で4で割り切れるかどうかを確認します。
- 途中で割り切れない場合は false を返します。
- 最終的に1になれば、その数は4の累乗であるため true を返します。
このアルゴリズムの計算量は O(log₄N)、空間計算量は O(1) であり、非常に効率的です。
実装例
以下は、この解法の動作を示すC++プログラムです。
#include <iostream>
using namespace std;
bool isPowerOf4(int n){
if(n == 0)
return 0;
while(n != 1)
{
if(n % 4 != 0)
return 0;
n = n / 4;
}
return 1;
}
int main(){
int n = 123454;
if (isPowerOf4(n))
cout<<"この数は4の累乗です";
else
cout<<"この数は4の累乗ではありません";
return 0;
}出力結果
この数は4の累乗ではありません
補足:ビット演算を使った別解
より高度な方法として、ビット演算を利用するアプローチもあります。4の累乗は2進数で表すと「1」の後に偶数個の「0」が並ぶ特徴があります。例えば、1(0b1)、4(0b100)、16(0b10000)、64(0b1000000)などです。
これを利用すると、n > 0 && (n & (n-1)) == 0 && (n & 0xAAAAAAAA) == 0 という条件式で、O(1) の定数時間で判定できます。(n & (n-1)) == 0 は2の累乗であることを確認し、(n & 0xAAAAAAAA) == 0 は奇数番目のビットに立っているビットがないこと(つまり4の累乗であること)を確認しています。
-
数値が2の累乗かどうかを判定するC++プログラムの書き方
与えられた数値が2の累乗(べき乗)であるかどうかを判定する方法を紹介します。まず、どのような数が2の累乗に該当するのかを確認しておきましょう。基本的な考え方は、数値が偶数である間は繰り返し2で割り続け、最終的に1になれば2の累乗、それ以外の場合は2の累乗ではないと判定するというものです。よりスマートな判定方法としては、数値の対数(log)を取る方法があります。底を2とした対数の計算結果が整数であれば、その数は2の累乗であり、整数でなければ累乗ではありません。2の累乗となる数は以下の通りです。2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048 ...22
-
C++で数値が素数かどうかを判定するプログラムの作成方法
素数とは? 素数(そすう)とは、1より大きい整数のうち、約数が「1」と「その数自身」のみである数のことです。最初の方の素数には以下のようなものがあります。 2, 3, 5, 7, 11, 13, 17 ここでは、入力された数値が素数かどうかを判定するC++プログラムを紹介します。 サンプルプログラム #include <iostream> using namespace std; int main() { int n=17, i, flag = 0; for(i=2; i<=n/2; ++i) { if(n%i==0) {