在每个有理数的十进制表示形式中p/q
,您具有以下形式的周期尾部,非周期性首部和小数点前的部分:
(before decimal point).(non-periodic)(periodic)
一些示例包括:
1/70 = 0.0142857... = (0).(0)(142857)
10/7 = 1.428571... = (1).()(428571) ## no non-periodic part
1/13 = 0.076923... = (0).()(076923)
3/40 = 0.075 = (0).(075)() ## no periodic part
-2/15 = -0.13... = -(0).(1)(3) ## negative
75/38 = 1.9736842105263157894... = (1).(9)(736842105263157894)
## periodic part longer than float can handle
25/168 = 0.148809523... = (0).(148)(809523)
120/99 = 40/33 = 1.212121... = (1).()(21)
2/1 = 2 = (2).()() ## no periodic, no non-periodic
0/1 = 0 = (0).()()
0/2 = 0 = (0).()()
299/792 = 0.37752... = (0).(377)(52)
95/-14 = -6.7857142... = -(6).(7)(857142)
-95/-14 = 6.7857142... = (6).(7)(857142)
面临的挑战是交换周期性和非周期性部分,before decimal point
更不用说创建新的数字了。例如:
25/168 = 0.148809523... = (0).(148)(809523)
=> (0).(809523)(148) = 0.809523148148... = 870397/1080000
如果一个数字没有周期部分,例如0.25
将其转换为新的周期数字,反之亦然。
1/4 = 0.25 = (0).(25)() => (0).()(25) = 0.252525... = 25/99
4/9 = 0.444444... = (0).()(4) => (0).(4)() = 0.4 = 2/5
5/1 = 5 = (5).()() => (5).()() = 5 = 5/1
挑战
- 以小数
x
作为输入,字符串,两个输入,一个有理数或任何适合您的语言的方法。 - 交换的十进制表示形式的周期性和非周期性部分
x
以创建新的数字,仅保留小数点之前的部分。周期性部分总是尽可能早地开始,以使非周期性部分尽可能短。示例如下。 - 返回交换后的数字作为新分数。尽管输出应该减少,但不一定减少输入。输入格式允许与输出格式不同。
- 分子
p
的x
将是与一个万以下的绝对值和分母的整数q
的x
将是一个非零的整数与一个万以下的绝对值。 - 结果的分子
r
和分母s
不能保证小于一百万。给定这些数字的周期部分的长度,建议您避免直接转换为浮点数。 - 这是代码高尔夫。以字节为单位的最短答案将获胜。
例子
1/70 = (0).(0)(142857) => (0).(142857)(0) = (0).(142857)() = 0.142857 = 142857/1000000
10/7 = (1).()(428571) => (1).(428571)() = 1.428571 = 1428571/1000000
1/13 = (0).()(076923) => (0).(076923)() = 0.076293 = 76923/1000000
3/40 = (0).(075)() => (0).()(075) = 0.075075... = 75/999 = 25/333
-2/15 = -(0).(1)(3) => -(0).(3)(1) = -0.311111... = -28/90 = -14/45
75/38 = (1).(9)(736842105263157894)
=> (1).(736842105263157894)(9) = (1).(736842105263157895)() ## since 0.999... = 1
= 1.736842105263157895 = 1736842105263157895/1000000000000000000
= 347368421052631579/200000000000000000
25/168 = (0).(148)(809523) => (0).(809523)(148) = 0.809523148148... = 870397/1080000
120/99 = (1).()(21) => (1).(21)() = 1.21 = 121/100
2/1 = (2).()() => (2).()() = 2 = 2/1
0/1 = (0).()() => (0).()() = 0 = 0/1
0/2 = (0).()() => (0).()() = 0 = 0/1
299/792 = (0).(377)(52) => (0).(52)(377) = 0.52377377... = 2093/3996
95/-14 = -(6).(7)(857142) => -(6).(857142)(7) = -6.857142777... = -12342857/1800000
-95/-14 = (6).(7)(857142) => (6).(857142)(7) = 6.857142777... = 12342857/1800000
如前所述,对于给定的输入,不会有唯一的答案。
—
ngenisis
1/7
可以表示为(0).()(142857)
或(0).(1)(428571)
,1
可以表示为(1).()()
,(0).()(9)
,(0).()(99)
,(0).(9)(9)
,等等
@ngenisis在示例中这是隐式的,但是我已经明确了。感谢您的反馈:)
—
Sherlock9'9
@ R.Kap我已经在挑战中指出,最好避免在此处使用浮点数。有一些方法可以查找数字的小数位数而不转换为浮点数。我希望这能回答您的问题:)
—
Sherlock9'2013/
p和q都可以为负吗?
—
edc65
0
测试案例2(10/7
)的末尾缺少:1428571/100000
应该是1428571/1000000
。