指定した範囲内で奇数個の約数を持つ要素の個数を求めるPythonプログラム
本記事では、以下の問題文に対する解決策について詳しく解説します。
問題文
問題 − ある範囲 [n, m] が与えられたとき、その範囲内に存在する「奇数個の約数を持つ数」の個数を求めます。
アプローチ
まず押さえておきたい重要な性質として、「完全平方数だけが奇数個の約数を持つ」ということが挙げられます。これは、約数が通常ペア(d と n/d)で現れるのに対し、完全平方数の場合は平方根に相当する約数だけがペアにならず単独で存在するためです。
したがって、この問題は「指定された範囲内に含まれる完全平方数の個数を数える」ことに帰着できます。
なお、n と m はどちらも範囲に含まれるため、境界値での誤差を避けるために、計算式では (n−1) の平方根を使用します。
それでは、実際の実装を見ていきましょう。
サンプルコード
# カウント用の関数
def count(n, m):
return int(m**0.5) - int((n-1)**0.5)
# メイン処理
n = 25
m = 400
print("Number of odd squares are: ", count(n, m))
出力
Number of odd squares are: 16
この例では、25 から 400 の範囲内に 16 個の完全平方数(5² から 20² まで)が存在することが確認できます。
上記のコードでは、すべての変数と関数がグローバルスコープで宣言されています。計算量は O(1) であり、範囲が非常に大きい場合でも高速に動作する点がこの手法の大きな利点です。
まとめ
本記事では、指定された範囲内で奇数個の約数を持つ要素の個数を求める方法について学びました。「完全平方数のみが奇数個の約数を持つ」という数学的な性質を利用することで、ループ処理を使わずに平方根の計算だけで効率的に答えを導き出せることを確認しました。
-
Pythonで数の偶数の約数の合計を求めるプログラムの実装方法
本記事では、以下の問題文に対する解決策について学びます。問題文整数 n が与えられたとき、その数の偶数の約数(偶因子)の合計を求めることが課題です。この問題を解くには、まず奇数の約数をすべて除外する必要があります。入力された数が奇数の場合、偶数の約数は一つも存在しないため、直接 0 を返します。そうでない場合は、以下のコードで示すアプローチに従います。アルゴリズムの考え方このアプローチでは素因数分解を活用します。約数の合計は「各素因数の冪乗の和の積」として表せるという性質を利用します。偶数の約数のみを対象とするため、素因数 2 の部分については 20(つまり 1)を除外し、21 以降の項だけを
-
Pythonプログラム:数の一意な素因数の積を求める方法
はじめに 本記事では、次の問題に対する解き方を学びます。 問題文: 整数 n が与えられたとき、その数が持つ一意な(重複しない)素因数をすべて求め、それらの積を返します。 例: 入力:num = 11 出力:積は 11 説明: 入力された数は 11 で、素因数は 11 のみです。 したがって、その積も 11 となります。 アプローチ1:総当たり法(ブルートフォース) i = 2 から n+1 までの for ループを使い、i が n の約数であるかどうかを確認します。約数であれば、さらに i 自身が素数かどうかを判定し、素数なら積に掛け合わせます。この処理を i が n に達するまで繰り返しま