C++で数値がx^y(累乗)として表現できるかどうかを判定する方法
この記事では、ある数値が xy のような累乗の形で表現できるかどうかを判定する方法を解説します。例えば、125 という数値は 53 と表現できます。一方、91 のような数値は、いかなる整数の累乗としても表現できません。
アルゴリズムの考え方
判定の基本的なアイデアは次のとおりです。底となる候補 i を 2 から順に試し、log(num) / log(i) を計算します。この結果がほぼ整数になれば、num は i の累乗として表せることになります。
isRepresentPower(num):
Begin
if num = 1, then return true
for i := 2, i*i <= num, increase i by 1, do
val := log(num)/log(i)
if val - int(val) < 0.0000000001, then return true
done
return false
Endポイント
- 1 は常に 1y として表現できるため、特別扱いして true を返します。
- ループは i * i <= num までで十分です。それ以上の底では指数が 1 より小さくなり、意味のある累乗になりません。
- 浮動小数点演算には誤差が伴うため、小数部が極めて小さい場合(ここでは 0.00000001 未満)は整数とみなして判定します。
C++での実装例
#include<iostream>
#include<cmath>
using namespace std;
bool isRepresentPower(int num) {
if (num == 1)
return true;
for (int i = 2; i * i <= num; i++) {
double val = log(num) / log(i);
if ((val - (int)val) < 0.00000001)
return true;
}
return false;
}
int main() {
int n = 125;
cout << (isRepresentPower(n) ? "Can be represented" : "Cannot be represented");
}実行結果
Can be represented
まとめ
この手法では、対数を使って各候補の底に対する指数を求め、それが整数に近いかどうかで判定を行います。計算量は O(√n) 程度に抑えられるため、比較的大きな数値でも効率的に処理できます。ただし、浮動小数点の誤差を考慮した閾値の設定が重要になる点には注意が必要です。
-
C++で数値が2つの三角数の和として表現できるか判定する方法
本記事では、ある整数が2つの三角数の和として表現できるかどうかを判定する方法を、C++のコード例とともに分かりやすく解説します。三角数とは三角数とは、1、3、6、10、15…のように、1から順に自然数を加算して得られる数列のことです。点を正三角形の形に並べたときの個数に対応することから「三角数」と呼ばれています。n番目の三角数は次の式で求められます。n × (n + 1) / 2例えば、1、3、6、10などが三角数に該当します。これらを利用すると、16は「6 + 10」という2つの三角数の和として表現できます。判定アルゴリズム判定の手順は非常にシンプルです。N未満のすべての三角数を生成し、セッ
-
Pythonで数値がa^bの形で表現できるかどうかを判定する方法
問題概要 ある数値 n が与えられたとき、その数値を a^b(aのb乗)の形で表現できるかどうかを判定する問題です。 例えば、入力が 125 の場合を見てみましょう。125 = 5^3 と表せるため、出力は True となります(このとき a = 5、b = 3)。 解き方のアプローチ この問題は、対数(ログ)を利用することで効率的に解くことができます。手順は以下の通りです。 num が 1 の場合は true を返します(1 = 1^b と常に表現できるため)。 i を 2 から始め、「i × i ≤ num」が成り立つ間ループを回します。 各 i について val = log(num)