ブルーブリッジカップ - 最初のn小数点(Python言語)



アイデアは:
nの値が大きい場合には、精度Pythonは、減算が、乗算演算子は大丈夫来て、我々は分裂自身の方法を見つけることができませんでした。
N / Mの例と、分割のプロセスをシミュレートすることが必要である:
N-> = M:M //リストN - 、%N-M = N-
N- <M:N-M * 10 //サプライヤー、N = N * 10% M
(プロセスについて記述された計算は100/3を導出することができます)

同時に、タイトルは有限小数、または無限小数のどちらか、剪定条件を与える
循環小数をどのように扱いますか?- > nで、使用レコード(すなわち、確認[X] = N = Xに、いくつかの小数の最初に相当する)、長い時間nがアクセスされ、次いで、サイクルが発生表します。その後、直接スプライシングの文字列部分へのループバックは、実際には、直接文字列の現在の長さとターゲットの長さの差から、ステッチなしで最適化されることができ、balabla上で撮影された、より高速でなければなりません(書きたくありません...

コード:

n, m, t = list(map(int, input("").split(" ")))
while n >= m:
    n = n % m
# 当前正在计算小数第几位
i = 0
# 结果字符串
s = ""
# 记录n的使用情况
check = {}
# n < m
while n:
    if n in check:
        # 表示开始出现了循环,找到上一个n的位置
        last = check[n]
        # 循环的部分是last~i-1
        circle = s[last:i]
        # 这里+10就是保证字符串的长度足够(加上其他的也可以
        s += ((t-i)//len(circle) + 10) * circle
        break
    check[n] = i
    s += str(n*10//m)
    n = n*10%m
    i += 1
    if i == t+10:
        break
s = s[t-1:t+2]
# 不足的补上"0"
s += (3 - len(s)) * "0"
print(s)

おすすめ

転載: www.cnblogs.com/NFii/p/12391109.html