Python
ProjectEuler
python3

Project Euler 26「逆数の循環節 その1」

いい加減python3に慣れておいた方がよいかと思ったので今回からpython3。
今のところ「xrangeなくなったんやなー」とか「printに'()'つけるんやなー」くらいしか変化を感じてないけども。

Problem 26 「逆数の循環節 その1」

単位分数とは分子が1の分数である. 分母が2から10の単位分数を10進数で表記すると次のようになる.

1/2 = 0.5
1/3 = 0.(3)
1/4 = 0.25
1/5 = 0.2
1/6 = 0.1(6)
1/7 = 0.(142857)
1/8 = 0.125
1/9 = 0.(1)
1/10 = 0.1

0.1(6)は 0.166666... という数字であり, 1桁の循環節を持つ. 1/7 の循環節は6桁ある.
d < 1000 なる 1/d の中で小数部の循環節が最も長くなるような d を求めよ.

def hoge(num):
    ans = 0
    for d in range(2, num):
        # 2、5で割れる数字が分母なら循環小数にはならない(たぶん)
        if d % 2 == 0 or d % 5 == 0:
            continue
        (i, remainder) = (1, 10)
        lst_remainder = []
        while True:
            remainder = remainder % d
            # 過去に同値の余りが出現していたらループを抜ける
            if remainder in lst_remainder:
                break
            # 余りをリストに貯めていく
            lst_remainder.append(remainder)
            (i, remainder) = (i + 1, remainder * 10)
        # リストのインデックスを利用し循環節の長さを計算
        cycle_length = i - (lst_remainder.index(remainder) + 1)
        if ans < cycle_length:
            ans = d
    return ans

print (hoge(1000))

変数名とかもちゃんとしていこうと思う今日この頃。