Mamy liczbę zmiennoprzecinkową z zakresu r
od 0 do 1 oraz liczbę całkowitą p
.
Znajdź ułamek liczb całkowitych o najmniejszym mianowniku, który aproksymuje r
z przynajmniej p
cyfrową precyzją.
- Dane wejściowe:
r
(liczba zmiennoprzecinkowa) ip
(liczba całkowita). - Wyjścia:
a
ib
liczby całkowite, gdziea/b
(jako liczba zmiennoprzecinkowa) jest przybliżanar
dop
cyfr.b
jest możliwą najmniejszą taką dodatnią liczbą całkowitą.
Na przykład:
- jeśli
r=0.14159265358979
ap=9
, - Następnie wynik jest
a=4687
ib=33102
, - dlatego
4687/33102=0.1415926530119026
.
Każde rozwiązanie musi działać teoretycznie z typami o dowolnej precyzji, ale ograniczenia wynikające z typów o stałej precyzji implementacji nie mają znaczenia.
Precyzja oznacza liczbę cyfr po „ 0.
” w r
. Tak więc, jeśli r=0.0123
i p=3
, to a/b
należy zacząć od 0.012
. Jeśli pierwsze p
cyfry części ułamkowej r
są równe 0, nieokreślone zachowanie jest dopuszczalne.
Kryteria wygranej:
- Algorytm najszybszy algorytm wygrywa. Prędkość jest mierzona w O (p).
- Jeśli istnieje wiele najszybszych algorytmów, wygrywa najkrótszy.
- Moja własna odpowiedź jest wykluczona z listy możliwych zwycięzców.
Ps część matematyczna jest w rzeczywistości o wiele łatwiejsza, jak się wydaje, proponuję przeczytać ten post.
padEnd
imatch
? Czy nie możesz po prostuslice
każdego łańcucha do odpowiedniej długości, a następnie odjąć je?