【Python】合計がNに等しく積が最大となる4つの約数を見つけるプログラム(セット2)
ある数 N が与えられたとき、N のすべての約数を求め、以下の条件を満たす4つの約数の積を返すことを考えます。
- 4つの約数の合計が N と等しいこと
- 4つの約数の積が最大であること
- 積を最大化するため、4つの約数は互いに同じ値でも構わない
問題例
たとえば入力が N = 60 の場合、出力は次のようになります。
- すべての約数:1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30, 60
- 最大の積:50625
この場合、15 を4回選ぶことで積が最大になります(15 × 15 × 15 × 15 = 50625、かつ 15 × 4 = 60)。
解法のアプローチ
この問題は、次の手順で解くことができます。
- 空のリスト
factorsを用意します。 - i を 1 から √n の整数部分 + 1 まで繰り返し、n が i で割り切れる場合は
iとn // iの両方をリストに追加します(これにより約数を効率よく列挙できます)。 - リストをソートして表示します。
final_prod = 1、flag = 1として初期化します。- 三重ループで約数の組み合わせ (i, j, k) を調べ、残りの値
y = n - factors[i] - factors[j] - factors[k]を計算します。 - y が 0 以下になったらループを抜けます。
- y が n の約数であれば
flag = 0とし、積factors[i] * factors[j] * factors[k] * yが現在の最大値より大きければ更新します。 - 最後に、有効な組み合わせが見つかった場合(flag == 0)は最大の積を表示し、見つからなければ「Not possible」を表示します。
実装例
それでは、実際の Python コードを見てみましょう。
from math import *
def get_factors(n):
factors = []
for i in range(1, int(sqrt(n)) + 1):
if n % i == 0:
factors.append(i)
factors.append(n // i)
factors.sort()
print("Factors are", factors)
final_prod = 1
flag = 1
for i in range(0, len(factors)):
for j in range(i, len(factors)):
for k in range(j, len(factors)):
y = n - factors[i] - factors[j] - factors[k]
if y <= 0:
break
if n % y == 0:
flag = 0
final_prod = max(factors[i] * factors[j] * factors[k] * y, final_prod)
if flag == 0:
print("Product is", final_prod)
else:
print("Not possible")
n = 60
get_factors(n)入力
60
出力
Factors are [1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30, 60] Product is 50625
計算量について
約数の列挙は O(√n) で行えますが、その後の三重ループによる組み合わせ探索は約数の個数を m とすると O(m³) かかります。そのため、N が非常に大きい場合や約数の個数が多い場合は実行時間が長くなる点に注意が必要です。ただし、y ≤ 0 になった時点で内側のループを打ち切ることで、無駄な計算を削減しています。
-
Pythonで数の奇数の約数(奇因子)の合計を求めるプログラム
この記事では、「整数 n が与えられたとき、その数の奇数の約数(奇因子)の合計を求める」という問題の解き方を解説します。 問題文 整数 n が入力として与えられます。求めるのは、n の奇数の約数をすべて足し合わせた値です。 例えば n = 27 の場合、約数は 1, 3, 9, 27 のすべてが奇数であるため、合計は 1 + 3 + 9 + 27 = 40 となります。 アプローチのポイント この問題で最初に行うべきは、偶数の約数をすべて除外することです。 偶数の約数を取り除くには、n が 2 で割り切れなくなるまで繰り返し 2 で割ります。この操作によって n から 2 の因数が完全に
-
Pythonで数の偶数の約数の合計を求めるプログラムの実装方法
本記事では、以下の問題文に対する解決策について学びます。問題文整数 n が与えられたとき、その数の偶数の約数(偶因子)の合計を求めることが課題です。この問題を解くには、まず奇数の約数をすべて除外する必要があります。入力された数が奇数の場合、偶数の約数は一つも存在しないため、直接 0 を返します。そうでない場合は、以下のコードで示すアプローチに従います。アルゴリズムの考え方このアプローチでは素因数分解を活用します。約数の合計は「各素因数の冪乗の和の積」として表せるという性質を利用します。偶数の約数のみを対象とするため、素因数 2 の部分については 20(つまり 1)を除外し、21 以降の項だけを