循环节
* * * *
拉格朗日计划
* * * *
循环节

输入数据是一系列以字符串$a/b$形式给出的分数,其中$a,b$都是自然数。

对每条输入数据,输出其对应的小数表示,无限循环小数的循环节应当放在小括号中。

本题难度:



解答

记$q=a/b$,若q的小数点后第j至第k位是循环节,那么$10^{j-1}q$与$10^kq$的小数部分相等。

另一方面,q的小数部分就等于$(a \bmod b)/b$,因此不断对分子作模b和乘10运算,并用列表y记录出现过的数,当某个数第二次出现时就找到了循环节。

此外,结果中是否需要包含小数点和是否需要包含小括号的判断比较繁琐,为便于处理,在计算的分子的同时就同时生成每个小数放在变量x中。

最终代码有五行。

代码长度:197字节 vs. 全站第一:110字节。

import sys
for d in sys.argv[1:]:
  a,b=map(int,d.split('/'));r,x,y=a%b,'',[]
  while r not in y:y+=[r];r*=10;x+=str(r//b);r%=b
  k=y.index(r);print(str(a//b)+('.'+x[:k]+(f"({x[k:]})")*(r>0))*(a%b>0))