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

Pythonで数値が「異なる階乗の和」として表せるかを判定するプログラム

問題の概要

正の整数 n が与えられたとき、n を互いに異なる階乗の値(1!, 2!, 3! など)の和として表すことができるかどうかを判定する問題です。

たとえば、入力が n = 144 の場合を考えてみましょう。

4! + 5! = 24 + 120 = 144 となるため、この場合の出力は True になります。

解法のアプローチ

この問題は、次の手順で解くことができます。

  1. fact を 1 で初期化し、結果を格納するための空のリスト res を用意します。また、カウンタ x を 2 とします。

  2. fact <= n である限り、以下を繰り返して n 以下のすべての階乗をリストに収集します。

    • res の末尾に fact を追加する
    • factfact * x で更新する
    • x を 1 増やす
  3. 収集した階乗を大きい方から順に走査し、n >= res[i] であれば n からその階乗の値を引きます。

  4. 最終的に n が 0 になっていれば True を返します。

大きな階乗から優先的に使っていくこの手法は「貪欲法」と呼ばれます。階乗の値は急激に増加するため、小さい階乗から詰めていくよりも、大きい側から処理する方が効率的かつ確実に判定できます。

実装例(Python)

それでは、実際のコードを見てみましょう。

class Solution:
    def solve(self, n):
        fact = 1
        res = []
        x = 2
        while fact <= n:
            res.append(fact)
            fact = fact * x
            x += 1
        for i in range(len(res) - 1, -1, -1):
            if n >= res[i]:
                n -= res[i]
        return n == 0

ob = Solution()
print(ob.solve(144))

実行結果

入力:

144

出力:

True

コードのポイント

  • 最初の while ループでは、1!(=1)、2!(=2)、3!(=6)、4!(=24)、5!(=120)…といった n 以下の階乗をすべてリストに格納しています。
  • 2番目の for ループでは、大きい階乗から順に引き算を行うことで、同じ階乗を二度使うことを防ぎ、「異なる階乗の和」という条件を満たしています。
  • 最後に残った n が 0 であれば、与えられた数を異なる階乗の組み合わせでちょうど表せたことになります。
  1. Pythonで数値が醜い数(Ugly Number)かどうかを判定するプログラム

    ある整数 n が与えられたとき、その素因数が 2・3・5 のみで構成されているかどうかを判定する問題を考えてみましょう。この条件を満たす正の整数は「醜い数(Ugly Number)」と呼ばれます。 例えば、入力が n = 18 の場合を考えます。18 の素因数は 2 と 3 だけなので、出力は True となります。 アルゴリズムの手順 この問題は、次の手順で解くことができます。 n < 0 の場合は False を返します。 チェック対象の因数として [2, 3, 5] のリストを用意します。 各因数 i について、n が i で割り切れる間、n を i で割り続けます。 最終的に

  2. 【Python入門】数値が素数かどうかを判定するプログラムの書き方

    この記事では、ユーザーが入力した数値(1より大きい整数)が素数かどうかを判定するPythonプログラムを紹介します。サンプルコードと実行結果、処理の流れを丁寧に解説しているので、Python初心者の方でも理解しやすい内容になっています。素数とは?素数とは、1より大きい正の整数のうち、約数が1とその数自身の2つしか存在しない数のことです。たとえば、2・3・5・7・11などは約数が1と自分自身だけであるため素数です。一方、4や6のように1と自分自身以外の約数を持つ数は「合成数」と呼ばれます。素数判定プログラムのサンプルコード# 入力された数値が素数かどうかを判定するPythonプログラム # ユ