Pythonで配列要素の最小公倍数(LCM)がkで割り切れるかどうかを判定する方法
配列 nums と整数 k が与えられたとき、配列内のすべての要素の最小公倍数(LCM)が k で割り切れるかどうかを判定します。
例えば、nums = [12, 15, 10, 75]、k = 10 の場合、配列要素の LCM は 300 となり、300 は 10 で割り切れるため、出力は True になります。
解き方のアプローチ
この問題は次の手順で解くことができます。
math.gcdを使って、配列の先頭から順に隣接する要素同士の LCM を計算していく- 最終的に得られた LCM を
kで割った余りが 0 かどうかを判定する - 余りが 0 なら
True、そうでなければFalseを返す
なお、「どれか1つの要素が k で割り切れればよい」と考えるのは誤りなので注意してください。例えば nums = [2, 3]、k = 6 の場合、個々の要素は 6 で割り切れませんが、LCM は 6 となるため答えは True になります。必ず LCM を計算してから判定しましょう。
実装例
以下のコードで実際の動作を確認できます。
from math import gcd
def solve(nums, k):
lcm = nums[0]
for i in range(1, len(nums)):
lcm = lcm * nums[i] // gcd(lcm, nums[i])
return lcm % k == 0
nums = [12, 15, 10, 75]
k = 10
print(solve(nums, k))入力
[12, 15, 10, 75], 10
出力
True
Python 3.9以降ならさらに簡単に書ける
Python 3.9 以降では math.lcm 関数が利用できるため、複数の値の LCM を一度に求められます。次のようにコードを大幅に簡潔化できます。
import math
def solve(nums, k):
return math.lcm(*nums) % k == 0まとめ
配列要素の LCM が k で割り切れるかを判定するには、まず LCM を正しく計算し、その余りを確認することが重要です。math.gcd や math.lcm を活用すれば、簡潔かつ効率的に実装できます。個々の要素の割り切り判定だけでは誤った結果になるケースがある点にも留意しましょう。
-
Pythonで数値が二面素数(Dihedral Prime)かどうかを判定する方法
ある整数nが与えられたとき、それが「二面素数(dihedral prime)」であるかどうかを判定する方法を解説します。二面素数とは、その数自体が素数であり、さらに7セグメントディスプレイに表示した際に、表示の向き(通常の向きでも上下逆さまでも)に関わらず、同じ数または別の素数として読み取れる数のことです。例えば、入力がn = 1181の場合、出力はTrueになります。下の数字は上の数字を上下逆さま(180度回転)にして表示したものであり、どちらも素数となっています。アルゴリズムの手順この問題を解くために、以下の手順で進めます。up_side_down() 関数を定義します。引数としてnを受け
-
Pythonで素数を判定するプログラムの書き方を徹底解説
はじめに この記事では、「与えられた数値が素数かどうかを判定する」という問題に対する解決策を、Pythonのコード例とともにわかりやすく解説します。 問題の概要 問題設定:ある数値が与えられたとき、その数が素数であるかどうかを判定するプログラムを作成します。 まず「素数」の定義をおさらいしましょう。1より大きい正の整数のうち、1とその数自身以外に約数を持たない数を素数(そすう)と呼びます。たとえば、2、3、5、7などはそれ以外の約数を持たないため、素数です。 プログラムの考え方 今回作成するプログラムでは、入力された数値が素数かどうかを以下の手順で判定します。 1以下の数値は素数ではない