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

Pythonで数値が2の累乗かどうかを判定するプログラム

この記事では、以下の問題に対する解決策について詳しく解説します。

問題文

ある整数が与えられたとき、その数が2の累乗であるかどうかを判定する必要があります。

この問題は、主に次の2つのアプローチで解くことができます。

アプローチ1: 繰り返し2で割って判定する

数値を順に2で割っていき、途中で割り切れなくなった場合(奇数が出現した場合)は2の累乗ではありません。最終的に1に到達できれば、その数は2の累乗であると判定できます。なお、0は2の累乗に含まれないため、あらかじめ除外しています。この方法の時間計算量は O(log n) です。

サンプルコード

# power of 2
def find(n):
    if (n == 0):
        return False
    while (n != 1):
        if (n % 2 != 0):
            return False
        n = n // 2
    return True
# Driver code
if(find(98)):
    print('Yes')
else:
    print('No')

実行結果

No

アプローチ2: ビット演算を使う

2の累乗となる数値は、2進表現において最上位の1ビットのみが1になっています(例:8 は「1000」)。この性質を利用すると、x と (x - 1) の論理積(AND)が必ず0になることを使って、非常に効率的に判定できます。この方法の時間計算量は O(1) であり、大きな数値を扱う場合にも高速です。

サンプルコード

# power of 2
def find(x):
    # x が 0 でないかどうかのチェックも含まれる
    return (x and (not(x & (x - 1))))
# Driver code
if(find(98)):
    print('Yes')
else:
    print('No')

実行結果

No

まとめ

この記事では、与えられた数値が2の累乗であるかどうかを判定する2つの方法を学びました。ひとつはシンプルに除算を繰り返す方法、もうひとつはビット演算を活用した高速な方法です。特にビット演算による手法は定数時間で判定できるため、パフォーマンスが求められる場面で非常に有効です。用途に応じて使い分けるとよいでしょう。

  1. 【Python入門】2つの文字列から珍しい単語(ユニークな単語)を見つけるプログラムの作り方

    はじめに この記事では、以下の問題文に対する解決方法を、実際のコード例とともにわかりやすく解説します。 問題文 2つの文字列が与えられたとき、その中から「珍しい単語」(どちらか一方の文字列にしか出現しない単語)をすべて抽出することを目標とします。両方の文字列に共通して含まれる単語は除外します。 解決のアプローチ ここでは辞書(dict)を使った出現回数のカウント方式を採用します。手順は次のとおりです。 空の辞書を用意する 各文字列をsplit()で単語ごとに分割する 各単語の出現回数を辞書に記録する 出現回数がちょうど1回の単語だけを結果として返す 実装例 # 珍しい単語を見つける関

  2. Pythonで数値が2の累乗かどうかを判定するプログラム

    本記事では、与えられた数値が2の累乗(べき乗)であるかどうかを判定する方法について、考え方と実装手順をわかりやすく解説します。 問題の定義 ある整数 n が与えられたとき、その数が2の累乗(1, 2, 4, 8, 16, …)であるかどうかを判定します。 アプローチ 判定には「繰り返し2で割る」というシンプルな方法を使います。考え方は以下の通りです。 入力された数値 n を、1になるまで繰り返し2で割っていきます(n = n // 2)。 割る過程で n % 2 の結果が0以外(奇数)になり、かつ n が1でない場合は、その数は2の累乗ではありません。 最終的に n がちょうど1になれば、そ