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

C++で数値が別の数値の累乗であるかどうかを判定する方法

この記事では、ある数値が別の数値の累乗として表せるかどうかを判定する方法を解説します。例えば、125 と 5 という2つの数値が与えられた場合、125 が 5 の累乗であれば true を返します。実際、125 = 53 なので、この場合は true となります。

判定の考え方はシンプルです。基数 x の累乗値を順番に計算していき、目的の数値 y に一致するかどうかを確認します。一致すれば「表せる」、y を超えてしまえば「表せない」と判断できます。

アルゴリズム

手順は以下の擬似コードの通りです。特別なケースとして、x が 1 の場合は y も 1 のときのみ true を返します(1 の累乗は常に 1 だからです)。

isRepresentPower(x, y):
Begin
    if x = 1, then
        if y = 1, return true, otherwise false
    pow := 1
    while pow < y, do
        pow := pow * x
    done
    if pow = y, then
        return true
    return false
End

C++による実装例

上記のアルゴリズムをC++で実装したコードがこちらです。whileループで累乗値を順次計算し、y と一致するかを判定しています。

#include<iostream>
#include<cmath>
using namespace std;
bool isRepresentPower(int x, int y) {
    if (x == 1)
        return (y == 1);
    long int pow = 1;
    while (pow < y)
        pow *= x;
    if(pow == y)
        return true;
    return false;
}
int main() {
    int x = 5, y = 125;
    cout << (isRepresentPower(x, y) ? "Can be represented" : "Cannot be represented");
}

実行結果

基数 5、判定対象 125 の場合、125 = 53 なので「表せる」という結果が出力されます。

Can be represented

このアルゴリズムの計算量は O(logx y) であり、累乗値が y を超えるまでループを回すだけなので非常に効率的です。大きな数値を扱う場合はオーバーフローに注意し、必要に応じて long long 型などを使用するとよいでしょう。

  1. アームストロング数を判定するC++プログラムの書き方と解説

    アームストロング数とはアームストロング数(Armstrong Number)とは、各桁の数字を「総桁数」乗した値の合計が、元の数そのものと等しくなる数のことです。例えば、153は3桁の数なので、各桁を3乗して足し合わせると元の数に戻ります。主なアームストロング数の例は以下の通りです。3 = 3^1 153 = 1^3 + 5^3 + 3^3 = 1 + 125 + 27 = 153 371 = 3^3 + 7^3 + 1^3 = 27 + 343 + 1 = 371 407 = 4^3 + 0^3 + 7^3 = 64 + 0 + 343 = 407この性質を利用すると、任意の整数がアームスト

  2. C#で数値が2の累乗かどうかを判定する方法をわかりやすく解説

    「2の累乗」とは、整数 n を用いて 2n の形で表せる数のことです。つまり、基数を2、指数を整数 n としてべき乗計算を行った結果の値を指します。代表的な2の累乗は以下の表のとおりです。n2n01122438416532このように、n = 0 のときは 20 = 1 となる点に注意してください。1 もまた2の累乗に含まれます。C#で数値が2の累乗かどうかを判定するには、主に2つのアプローチがあります。それぞれサンプルコードとともに見ていきましょう。方法1:ビット演算を使う(高速・定番)2の累乗である数をバイナリで表すと、最上位ビットだけが1になり、それ以外はすべて0になります。例えば、8 は