Ketika Anda mengonversi pecahan menjadi angka desimal dan Anda ingin menyimpan angka itu, Anda sering harus membulatkannya, karena Anda hanya ingin menggunakan sejumlah memori. Katakanlah Anda hanya dapat menyimpan 5 angka desimal, kemudian 5/3 menjadi 1.6667. Jika Anda dapat menyimpan hanya 2 digit desimal, itu akan menjadi 1,7 (sekarang dengan asumsi selalu antara 0 dan 9,99 ...).
Jika Anda sekarang mencoba untuk membalik proses itu dengan 1,7 dan Anda ingin mendapatkan pecahan Anda kembali, itu bisa sulit, karena Anda tahu bahwa 1,7 hanya angka bulat. Tentu saja Anda dapat mencoba 17/10 tapi itu fraksi yang agak 'jelek' dibandingkan dengan 5/3 yang 'elegan'.
Jadi tujuannya sekarang menemukan pecahan a / b dengan penyebut terkecil b, yang menghasilkan angka desimal bulat ketika dibulatkan dengan benar.
Detail
Input berisi string dengan angka 1 hingga 5 digit antara 0 (termasuk) dan 10 (tidak termasuk) dengan tanda '.' setelah digit pertama. Katakanlah n
menunjukkan jumlah digit. Output harus berupa daftar / larik dua bilangan bulat [numerator, denominator]
atau tipe data rasional (Anda dapat membuat sendiri atau menggunakan built-in) di mana pembilangnya tidak negatif dan penyebutnya positif. Pembilang pecahan / penyebut harus sama dengan input ketika dibulatkan dengan benar ke n
digit (yang berarti n-1
digit setelah titik desimal).
Pembatasan: hanya satu pernyataan loop yang dibolehkan. Ini berarti bahwa Anda hanya dapat menggunakan satu pernyataan perulangan tunggal (seperti for
atau while
atau goto
dll. Serta loop fungsional seperti map
atau fold
yang menerapkan kode ke setiap elemen daftar / larik) di seluruh kode Anda, tetapi Anda bebas untuk 'menyalahgunakannya' atau gunakan rekursi dll.
Anda harus menulis fungsi. Jika bahasa Anda tidak memiliki fungsi (atau bahkan jika itu), Anda dapat mengasumsikan bahwa input disimpan dalam variabel (atau input melalui stdin) dan cetak hasilnya atau tulis ke file. Jumlah byte terendah menang.
Pembulatan
Pembulatan harus mengikuti aturan pembulatan 'konvensional', yaitu jika angka terakhir yang akan terpotong adalah 5 atau lebih besar, Anda akan dibulatkan ke atas, dan Anda akan dibulatkan ke bawah untuk kasus lain, jadi misalnya:
4.5494 akan dihasilkan saat pembulatan ke
- 1 digit: 5
- 2 digit: 4,5
- 3 digit: 4,55
- 4 digit: 4,549
Contohnya
Harap sertakan kasus uji berikut dan yang 'menarik' lainnya:
Input 1.7 Output 5/3
Input 0. Output 0/1
Input 0.001 Output 1/667
Input 3.1416 Output 355/113
for n in numbers: f(g(n))
setara dengan map(f, map(g, numbers))
. Versi fungsional menggunakan map
dua kali, haruskah itu benar-benar dianulir?
repeat
membuat daftar argumennya yang tak terbatas. Sepertinya tidak, tetapi sebenarnya memiliki kompleksitas waktu O (1). Tapi saya kira menyortir setiap kasus secara individual lebih baik daripada tidak mengizinkan bahasa fungsional.