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

C++で与えられた整数が3の累乗かどうかを判定する方法

この問題では、整数Nが与えられ、その整数が3の累乗であるかどうかを判定することが課題となります。

問題の例

具体的な例を見てみましょう。

入力 : N = 729
出力 : Yes

説明:

36 = 729

729は3の6乗に等しいため、3の累乗であると判定できます。

解法のアプローチ

この問題を効率的に解くには、3の累乗の性質を利用します。ポイントとなるのは、32ビット符号付き整数で表現できる最大の3の累乗は 1162261467(319 であるという点です。

判定方法は非常にシンプルです。与えられた数Nが 1162261467 を割り切れるかどうか を確認します。もしNが3の累乗であれば、その約数はすべて3の累乗(1, 3, 9, 27, ...)であるため、必ず余りが0になります。逆に、余りが0でなければNは3の累乗ではありません。

この手法の利点は、ループや再帰を使わずにたった1回の剰余演算(O(1))で判定できることです。

実装例

この解法をC++で実装したプログラムが以下です。

#include <iostream>
using namespace std;

bool isPowerOf3(int n){
    if (n <= 0)
        return false;
    return 1162261467 % n == 0;
}

int main(){
    int n = 27;
    if (isPowerOf3(n))
        cout << "The number is a power of 3";
    else
        cout << "The number is not a power of 3";
    return 0;
}

出力結果

The number is a power of 3

解説

コードの動作を詳しく見てみましょう。

  • 負の数と0の除外: n ≤ 0 の場合は false を返します。3の累乗は常に正の数だからです。
  • 剰余による判定: 1162261467 % n == 0 が成立すれば、n は 319 の約数であり、すなわち3の累乗です。
  • 計算量: ループ不要のため、時間計算量はO(1)、空間計算量もO(1)と非常に効率的です。

上記の例では n = 27 は 33 に等しいので、「The number is a power of 3」と出力されます。

  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++】2つの特定のノード間にパスが存在するかどうかを確認するプログラム

    グラフにおいて「ある頂点から別の頂点へ到達できるか」を判定する問題は、経路探索やネットワーク解析など、さまざまな場面で登場する基本的な課題です。本記事では、C++を用いて、指定した2つのノード(頂点)間にパス(経路)が存在するかどうかを確認するプログラムを紹介します。 アルゴリズム このプログラムでは、幅優先探索(BFS)をベースとした関数 isReach() を使い、始点 s から終点 d への到達可能性を調べます。処理の手順は以下の通りです。 開始   isReach() は、d が s から到達可能かどうかを判定する再帰的な関数である:   A) すべての頂点を「未訪問」としてマーク