Comment detail

分数を小数に展開 (Nested Flatten)

This comment is reply for 179 shn: 素直に書いたらこんなのになりました・・・(分数を小数に展開). Go to thread root.

基本的な流れは同じですが、いらないと思うところを削るとこうなりました。
・問題条件でa < bなので整数部は0に決まっている
・単にwhileでループするだけなのでジェネレータ使うまでもない?
・組み込み関数にdivmodがある
・文字列化を後でやればremindsはいらない
という感じでしょうか。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
def fraction_to_decimal(numerator, denominator):
    result = []
    num = numerator * 10
    den = denominator
    while num:
        div, num = divmod(num, den)
        if div in result:
            # repeating
            idx = result.index(div)
            return "0.%s{%s}" % (
                "".join(str(x) for x in result[:idx]),
                "".join(str(x) for x in result[idx:]))

        result.append(div)
        num *= 10

    return "0." + "".join(str(x) for x in result)
あー、denominatorが使われるのは1回だけだから
名前を付け替える必要はなかったか…。
divmod なんてあるんすねぇ。 divじゃなくて、numの2回目で跳ねないと 1 / 191とかで間違えますぜ
>>> fraction_to_decimal(3,14) '0.{214}' となってしまうので、remindsは必要だと思います。
ああっ、確かにそうですね。
うっかりしてました。
どこかおかしいですよ。

Python 2.5 (r25:51908, Sep 19 2006, 09:52:17) [MSC v.1310 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> def fraction_to_decimal(numerator, denominator):
...     result = []
...     num = numerator * 10
...     den = denominator
...     while num:
...         div, num = divmod(num, den)
...         if div in result:
...             # repeating
...             idx = result.index(div)
...             return "0.%s{%s}" % (
...                 "".join(str(x) for x in result[:idx]),
...                 "".join(str(x) for x in result[idx:]))
...         result.append(div)
...         num *= 10
...     return "0." + "".join(str(x) for x in result)
...
>>> fraction_to_decimal(3,8)
'0.375'
>>> fraction_to_decimal(3,14)
'0.{214}'

Index

Feed

Other

Link

Pathtraq

loading...