2520 は 1 から 10 までの数で割り切ることができる最小の数である。
1 から 20 までの数で割り切ることができる最小の値は何か?
もっとも単純なのがユークリッドの互除法を用いて最小公倍数を求める方法である。
x, y の最小公倍数は、最大公約数 L を用いて、x $\times$ y / $\lfloor$L$\rfloor$ で算出することができる。
# SAMPLE_1 def gcd(x, y): if y != 0: return gcd(y, x % y) return x def lcm(x, y): return (x * y) // gcd(x, y) N = 20 ans = 1 for n in range(2, N + 1): ans = lcm(ans, n) print ansまた、Project Euler 3と同様、素因数分解する方法でも算出してみた。 各素数のべき乗数の最大値を集約し計算する。
# SAMPLE_2 from math import sqrt def f(x, n): r = 0 while x % n == 0: x /= n r += 1 return x, r def integer_factorization(n): ans = {} n0 = n n0, r = f(n0, 2) if r != 0: ans[2] = r i = 3 while(i < int(sqrt(n)) + 1): n0, r = f(n0, i) if r != 0: ans[i] = r i += 2 if n0 != 0: ans[n0] = 1 return ans N = 20 ans = {} for i in range(2, N + 1): dic = integer_factorization(i) for j in dic.keys(): try: ans[j] = max(ans[j], dic[j]) except KeyError: ans[j] = dic[j] r = 1 for i in ans.keys(): r *= i ** ans[i] print r
0 件のコメント:
コメントを投稿