记$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))
|