分数化小数
题目描述
对于一个分数(不一定是最简形式),给出它的小数形式,如果小数有循环节的话,把循环节放在一对圆括号中.
例如,1/4 =0.25
,1/3=0.3333
写成0.(3)
,1/7= 0.142857142857...
写成0.(142857)
。如果结果是一种整数xxx
,则用xxx.0
等表示整数xxx
。
输入包括一行,包括被空格分隔开的分子N和分母D(第一个是N,第二个是D)。
输出包括一行,为转换后的小数形式。
输入样例
45 56
输出样例
0.803(571428)
题目解释
题目中需要求一个 分数 的小数,如果是无限循环小数,则输出 0.xxx(xxx)
的格式。
因此我们考虑,先求出这个小数的 循环起始点(S) 和 循环长度(T)。
我们举个栗子。对于 x = 45 56 x = \frac{45}{56} x=5645 这种情况。
我们考虑先对 x ∗ 10 x * 10 x∗10 即: 45 56 , 450 56 , 4500 56 , 45000 56 ⋯ \frac{45}{56},\frac{450}{56},\frac{4500}{56},\frac{45000}{56}\cdots 5645,56450,564500,5645000⋯
然后我们将这些分数的分子进行 m o d 56 mod\ 56 mod 56 操作, 即: 45 56 , 2 56 , 20 56 , 32 56 , 40 56 , 8 56 , 24 56 , 16 56 , 48 56 , 32 56 , 40 56 ⋯ \frac{45}{56},\frac{2}{56},\frac{20}{56},\frac{32}{56},\frac{40}{56},\frac{8}{56},\frac{24}{56},\frac{16}{56},\frac{48}{56},\frac{32}{56},\frac{40}{56}\cdots 5645,562,5620,5632,5640,568,5624,5616,5648,5632,5640⋯
我们可以明显的发现当操作进行到第 10 次的时候和第 4 次重复了,显然已经形成了一个长度为 6 的循环节,即从第 4 项开始循环。
由此我们可以推广到更一般的情况。假设分数为 p q \frac{p}{q} qp ,由于小数部分和整数无关,因此我们可以假设这个分数为真分数。不妨假设 p < q p<q p<q。
由上可知,我们可以把第 k + 1 k + 1 k+1 个分数写成 p ∗ 1 0 k m o d q q \frac{p*10^k\ mod\ q}{q}