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

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になっていることからも確認できます。

判定手順

  1. 入力された数 n を受け取ります。
  2. 「n & 1」(ビットごとのAND)が0であれば偶数なので、true を返します。
  3. それ以外(奇数)の場合は 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) を活用するなど、目的に応じた方法を使い分けるとよいでしょう。

  1. C++で数値が2つの三角数の和として表現できるか判定する方法

    本記事では、ある整数が2つの三角数の和として表現できるかどうかを判定する方法を、C++のコード例とともに分かりやすく解説します。三角数とは三角数とは、1、3、6、10、15…のように、1から順に自然数を加算して得られる数列のことです。点を正三角形の形に並べたときの個数に対応することから「三角数」と呼ばれています。n番目の三角数は次の式で求められます。n × (n + 1) / 2例えば、1、3、6、10などが三角数に該当します。これらを利用すると、16は「6 + 10」という2つの三角数の和として表現できます。判定アルゴリズム判定の手順は非常にシンプルです。N未満のすべての三角数を生成し、セッ

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