【分数->小数】
给定分数的分子N和分母A,输出其小数表示法,小数的循环节用括号括起来。
N/A 小数
5/1 5
125/12 10.41(6)
8/235 0.0340425531914...
235/8 29.375
10/3 3.(3)
以 125/12 和 235/8 看看计算过程:
分子 | 分母 | 商 | 余数 |
125 | 12 | 10 | 5 |
5*10 | 12 | 4 | 2 |
2*10 | 12 | 1 | 8 |
8*10 | 12 | 6 | 8 |
分子 | 分母 | 商 | 余数 |
235 | 8 | 29 | 3 |
3*10 | 8 | 3 | 6 |
6*10 | 8 | 7 | 4 |
4*10 | 8 | 5 | 0 |
结果可以分成3种情况:
1)整数,没有小数部分:分子除以分母,余数直接为0。
2)能除尽的小数,即有限小数:在某一步,余数会=0。
3)无限循环小数:在某一步除法以后得到的余数,已经在之前出现过了。实现时,需要保存每一步的商和余数。
而无限不循环小数不能表示成分数。对于任意分数a/b,每次除法得到的余数,只能是1到a-1中的某个数,因此在计算了a步之后,一共能得到a个在计算过程中产生的余数。根据抽屉原理,这a个余数中必定有两个数是相等的。由于每一步得到的余数在下一步将作为被除数,因此出现第一个重复的余数时,就开始循环了。
对于2)和3)情况,有可能小数部分非常长,所以给定一个精度,超过精度位数直接截断。
【小数->分数】
采用斜率逼近法。
分数相当于平面上直线的斜率。对于整数来说,初始设置分子为0,分母为1,即平行于X轴,将这个分数的值同输入的小数比较,如果分数太大,则增加分母的值,如分数太小,则增加分子的值,直到分数的值在指定的精度范围内接近这个斜率(就是输入的小数)。负数的话,单独处理一下负号就行了。