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

Pythonで指定範囲内の整数の積が正・負・ゼロのどれかを判定する方法

範囲 [l, u] の下限 l と上限 u が与えられたとき、その範囲に含まれるすべての整数の積が「正」「負」「ゼロ」のどれになるのかを判定する問題です。

例えば、l = -8、u = -2 が入力された場合を考えてみましょう。この範囲に含まれる整数は [-8, -7, -6, -5, -4, -3, -2] の7個で、その積は -40320 となるため、答えは「Negative(負)」になります。

解法のアプローチ

範囲内のすべての数を実際に掛け合わせる必要はありません。積の符号は各数の符号だけで決まるため、次のような条件分岐で効率的に判定できます。

  • l と u がどちらも正の場合:範囲内のすべての数が正なので、積は必ず正 → "Positive" を返す
  • 範囲が 0 を含む場合(l ≤ 0 かつ u ≥ 0):積の中に 0 が含まれるため、結果は必ず 0 → "Zero" を返す
  • それ以外(両方とも負)の場合
    • 範囲内の整数の個数を n = |l − u| + 1 として求める
    • n が偶数なら、負の数を偶数回掛けることになるので積は正 → "Positive" を返す
    • n が奇数なら、積は負 → "Negative" を返す

実装例(Pythonコード)

def solve(l, u):
    if l > 0 and u > 0:
        return "Positive"
    elif l <= 0 and u >= 0:
        return "Zero"
    else:
        n = abs(l - u) + 1
        if n % 2 == 0:
            return "Positive"
        return "Negative"

l = -8
u = -2
print(solve(l, u))

入力

-8, -2

出力

Negative

コードのポイント

このアルゴリズムの計算量は O(1) です。範囲内の数を一つずつ掛ける代わりに、符号の性質だけを利用して即座に答えを導き出せる点が大きな特徴です。例えば l = -10億、u = -10億 + 100 のような巨大な範囲でも、実際に積を計算すれば桁違いに大きな数になってしまいますが、この方法なら一瞬で判定できます。

また、「負 × 負 = 正」という数学の基本法則が、偶数個・奇数個の判定として活きているのも注目ポイントです。競技プログラミングやコーディング面接でも頻出の考え方なので、ぜひ覚えておきましょう。

  1. Pythonで数値が二面素数(Dihedral Prime)かどうかを判定する方法

    ある整数nが与えられたとき、それが「二面素数(dihedral prime)」であるかどうかを判定する方法を解説します。二面素数とは、その数自体が素数であり、さらに7セグメントディスプレイに表示した際に、表示の向き(通常の向きでも上下逆さまでも)に関わらず、同じ数または別の素数として読み取れる数のことです。例えば、入力がn = 1181の場合、出力はTrueになります。下の数字は上の数字を上下逆さま(180度回転)にして表示したものであり、どちらも素数となっています。アルゴリズムの手順この問題を解くために、以下の手順で進めます。up_side_down() 関数を定義します。引数としてnを受け

  2. Pythonで文字列が指定したサフィックス(接尾辞)リストのいずれかで終わるかどうかを確認する方法

    endswith()メソッドを使う方法 Pythonの文字列クラスには、endswith()メソッドが用意されています。このメソッドは、検索したい文字列のタプルを受け取り、文字列オブジェクトに対して呼び出します。以下のように使用できます。 string = core java print(string.endswith((txt, xml, java, orld))) 実行結果 True タプル内のいずれかのサフィックスで文字列が終わっていればTrueが返され、どれにも該当しなければFalseが返されます。シンプルな判定であれば、この方法が最も可読性が高くおすすめです。 正規表現(re.sea