Project Euler Problem 57
何年ぶりだろうか、Project Eulerを再開した。今回はProblem 57。
問題は、
という数列を考えたとき、1000番目までの数の中に、分子の桁数が分母の桁数より多いような分数はいくつ登場するか、ということ。最初に登場するのは である。
まず、最初の1を加算しているところが邪魔なので、1を除いた分数を と置く。
すると、
となることが容易にわかる。次に、
とおいてやると、簡単な式変形により
とわかる。あとは、これを計算するだけだ。実際に計算すべき分数はであることと、約分をする必要があることに注意してコードを書けば、
import sys if len(sys.argv) >= 2: Len = int(sys.argv[1]) else: Len = 1000 D = [0] * (Len+1) N = [0] * (Len+1) def gcd(m, n): if m < n: return gcd(n, m) r = m % n while r > 0: m, n = n, r r = m % n return n def reduce(a, b): d = gcd(a, b) return a/d, b/d count = 0 for n in range(1, Len+1): if n == 1: N[1] = 1 D[1] = 2 else: N[n] = D[n-1] D[n] = N[n-1] + 2 * D[n-1] nr, dr = reduce(N[n] + D[n], D[n]) if len(str(nr)) > len(str(dr)) : count += 1 print count
これを実行すれば答えが表示される。も消せるけど、まぁいいや。