C++で整数Nが2^x + 2^yの形で表現できるかを判定する方法
この記事では、与えられた整数Nが、2つの0でない2の冪の和――すなわち 2x + 2y(x, y > 0)――の形で表現できるかどうかを判定する方法を解説します。例えば10は 23 + 21 = 8 + 2 と表せるため、条件を満たします。
考え方:数の偶奇に着目する
判定のアプローチは非常にシンプルで、次の2つのケースに分けて考えます。
- Nが偶数の場合:2の冪の和として表現できると判定します。偶数は 2x(x > 0)の形で扱うことができます。
- Nが奇数の場合:表現できません。x, y > 0 の制約下では 2x も 2y も必ず偶数になるため、その和も必然的に偶数になります。これは、奇数の2進表現の最下位ビット(LSB)が必ず1になっていることからも確認できます。
判定手順
- 入力された数 n を受け取ります。
- 「n & 1」(ビットごとのAND)が0であれば偶数なので、true を返します。
- それ以外(奇数)の場合は false を返します。
C++での実装例
#include <iostream>
using namespace std;
// n が 2^x + 2^y(x, y > 0)の形で表せるかを判定する
bool isSumofTwosPower(int n) {
if ((n & 1) == 0) {
return true; // 偶数なら表現可能
} else {
return false; // 奇数は表現不可
}
}
int main() {
int num = 86;
if (isSumofTwosPower(num)) {
cout << "2の冪の和として表現できます";
} else {
cout << "2の冪の和として表現できません";
}
}
実行結果
2の冪の和として表現できます
補足
ここで紹介した判定は「偶数なら表現可能」というシンプルなルールに基づいています。もし「ちょうど2つの2の冪の和」と厳密に判定したい場合は、2進表現におけるセットビット(1になっているビット)の数を数える __builtin_popcount(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)