Pertanyaan ini tidak perlu diterapkan pada penghentian desimal saja - desimal berulang juga dapat dikonversi menjadi pecahan melalui suatu algoritma.
Tugas Anda adalah membuat program yang mengambil desimal berulang sebagai input, dan menampilkan pembilang dan penyebut yang sesuai (dalam istilah terendah) yang menghasilkan ekspansi desimal itu. Pecahan yang lebih besar dari 1 harus dinyatakan sebagai pecahan yang tidak tepat 9/5
. Anda dapat berasumsi bahwa input akan positif.
Desimal berulang akan diberikan dalam format ini:
5.3.87
dengan semua setelah titik kedua diulang, seperti ini:
5.3878787878787...
Program Anda akan menghasilkan dua bilangan bulat yang mewakili pembilang dan penyebut, dipisahkan oleh garis miring (atau bentuk yang setara dalam bahasa Anda jika Anda tidak menampilkan teks biasa):
889/165
Perhatikan bahwa penghentian desimal tidak akan memiliki apa pun setelah titik kedua, dan desimal tanpa bagian desimal yang tidak berulang tidak akan memiliki apa pun di antara kedua titik.
Uji kasus
Kasing uji ini mencakup semua kasing yang diperlukan:
0..3 = 1/3
0.0.3 = 1/30
0.00.3 = 1/300
0.6875. = 11/16
1.8. = 9/5
2.. = 2/1
5..09 = 56/11
0.1.6 = 1/6
2..142857 = 15/7
0.01041.6 = 1/96
0.2.283950617 = 37/162
0.000000.1 = 1/9000000
0..9 = 1/1
0.0.9 = 1/10
0.24.9 = 1/4
Jika diinginkan, Anda juga dapat mengasumsikan bahwa pecahan tanpa bagian bilangan bulat tidak memiliki apa pun di sebelah kiri titik pertama. Anda dapat mengujinya dengan kasus uji opsional ini:
.25. = 1/4
.1.6 = 1/6
..09 = 1/11
.. = 0/1
(in lowest terms)
yaitu fraksi harus disederhanakan.
13
bukan 13/1
?
1.9999...
dan output ini2/1
1.9999.
adalah 19999/10000
, untuk memenuhi 2/1
kebutuhan Anda 1..9
, bukan?
9/99
?