W dziesiętnej reprezentacji każdej liczby wymiernej p/qmasz okresowy ogon, nieokresową głowę i sekcję przed przecinkiem w następującym formacie:
(before decimal point).(non-periodic)(periodic)
Niektóre przykłady obejmują:
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)
Wyzwanie polega na zamianie części okresowych i nieokresowych, pozostawiając w before decimal pointspokoju, aby utworzyć nową liczbę. Na przykład:
25/168 = 0.148809523... = (0).(148)(809523)
=> (0).(809523)(148) = 0.809523148148... = 870397/1080000
Jeśli liczba nie ma części okresowej, takiej jak 0.25zamień ją na nową liczbę okresową i odwrotnie.
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
Wyzwanie
- Weź ułamek
xjako dane wejściowe, ciąg znaków, dwa dane wejściowe, liczbę wymierną lub dowolną metodę odpowiednią dla twojego języka. - Zamień okresowe i nieokresowe części reprezentacji dziesiętnej na,
xaby utworzyć nową liczbę, pozostawiając tę część przed samą dziesiętną. Część okresowa rozpoczyna się zawsze tak szybko, jak to możliwe, aby część nieokresowa była jak najkrótsza. Przykłady są poniżej. - Zwraca zamienioną liczbę jako nową część. Wejście niekoniecznie jest zmniejszone, chociaż wyjście powinno być. Format wejściowy może różnić się od formatu wyjściowego.
- Licznik
pstanowixbędzie liczbą całkowitą o wartości bezwzględnej milion lub mniej i mianownikaqdoxbędzie niezerowy całkowitą o wartości bezwzględnej milion lub mniej. - Licznik
ri mianownikswyniku nie jest gwarantowany na mniej niż milion. Biorąc pod uwagę długość okresowych części tych liczb, zaleca się unikanie bezpośredniej konwersji na liczby zmiennoprzecinkowe. - To jest kod golfowy. Najkrótsza odpowiedź w bajtach wygrywa.
Przykłady
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
1/7może być reprezentowane (0).()(142857) lub (0).(1)(428571), 1mogą być reprezentowane (1).()(), (0).()(9), (0).()(99), (0).(9)(9), itd.
0końcu przypadku testowego 2 (10/7) brakuje :1428571/100000powinno być1428571/1000000.