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

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の累乗であること)を確認しています。

  1. 数値が2の累乗かどうかを判定するC++プログラムの書き方

    与えられた数値が2の累乗(べき乗)であるかどうかを判定する方法を紹介します。まず、どのような数が2の累乗に該当するのかを確認しておきましょう。基本的な考え方は、数値が偶数である間は繰り返し2で割り続け、最終的に1になれば2の累乗、それ以外の場合は2の累乗ではないと判定するというものです。よりスマートな判定方法としては、数値の対数(log)を取る方法があります。底を2とした対数の計算結果が整数であれば、その数は2の累乗であり、整数でなければ累乗ではありません。2の累乗となる数は以下の通りです。2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048 ...22

  2. 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) {