LoginSignup
2
1

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-02-13

いい加減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))

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

2
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1