Pythonで2つの数の約数の合計が等しいかどうかを判定する方法
問題概要
2つの整数 p と q が与えられたとき、それぞれの約数の合計が一致しているかどうかを判定する方法を解説します。
例えば、p = 559、q = 703 という入力の場合、出力は True になります。これは、559 の約数が 1, 13, 43、703 の約数が 1, 19, 37 であり、それぞれの合計がどちらも 57 で一致するためです。
アルゴリズムの考え方
この問題を効率的に解くには、以下の手順に従います。
divSum()関数を定義します。引数としてnを受け取ります。totalを 1 で初期化し、iを 2 で初期化します。i * i <= nを満たす間、次の処理を繰り返します。nがiで割り切れる場合、totalにiとfloor(n / i)(n を i で割った商の切り捨て値)を加算します。iを 1 増やします。
totalを返します。- メイン処理では、
divSum(p)とdivSum(q)が等しければtrueを、そうでなければfalseを返します。
このアルゴリズムのポイントは、約数を「小さい方と大きい方」のペアとして同時に加算することで、√n まで調べるだけでよい点です。すべての候補を順番に確認する O(n) の素朴な方法と比べ、O(√n) で計算できるため、大きな数でも高速に処理できます。
Pythonによる実装例
from math import floor
def divSum(n):
total = 1
i = 2
while i * i <= n:
if n % i == 0:
total += i + floor(n / i)
i += 1
return total
def solve(p, q):
return divSum(p) == divSum(q)
p = 559
q = 703
print(solve(p, q))
入力
559, 703
出力
True
まとめ
約数の合計を求める際、平方根までの範囲だけを走査して約数をペアごとに加算することで、計算量を大幅に削減できます。あとは2つの数それぞれに対してこの関数を適用し、結果を比較するだけで、約数の合計が一致しているかどうかを簡単に判定できます。
-
Pythonで2つの二分木の葉の並び(シーケンス)が同じかどうかを確認する方法
はじめに2つの二分木が与えられたとき、それぞれの木を左から右へたどったときの葉ノードの並び(シーケンス)が一致しているかどうかを判定する問題を考えてみましょう。例えば、次のような2つの木が入力として与えられた場合を想定します。この場合、どちらの木も葉の並びは [2, 6] となるため、出力は True になります。解決のアプローチこの問題を解くためには、以下の手順に従います。結果を格納するための新しいリスト c を用意します。inorder() 関数を定義します。この関数はルートノードとリスト c を引数に取ります。c が null の場合は、新しい空のリストを作成します。ルートノードが nu
-
Pythonで2つの数の公約数を求めるプログラムの書き方
はじめに この記事では、以下の問題文に対する解決方法について学んでいきます。 問題文 2つの整数が与えられたとき、それらに共通する約数(公約数)の個数を表示する必要があります。 アプローチの考え方 まず、入力として受け取った2つの数のうち、小さい方の値(最小値)を計算します。続いて、1からその最小値までの各値で2つの数を順番に割っていき、両方の数を割り切ることができるかどうかをループ処理で確認します。 条件が真(True)と評価されるたびに、カウンターを1ずつ増加させます。最終的なカウンターの値が、2つの数の公約数の個数となります。 実装例 それでは、以下のコードで実際の実装を見てみましょう。