Kiedy konwertujesz ułamek na liczbę dziesiętną i chcesz zapisać tę liczbę, często musisz ją zaokrąglić, ponieważ chcesz użyć tylko określonej ilości pamięci. Załóżmy, że możesz zapisać tylko 5 cyfr dziesiętnych, a następnie 5/3 staje się 1,6667. Jeśli możesz zapisać tylko 2 cyfry dziesiętne, będzie to 1,7 (teraz zakładając, że zawsze zawiera się między 0 a 9,99 ...).
Jeśli teraz spróbujesz odwrócić ten proces za pomocą 1.7 i chcesz odzyskać swoją frakcję, może to być trudne, ponieważ wiesz, że 1.7 to tylko zaokrąglona liczba. Oczywiście możesz wypróbować 17/10, ale jest to raczej „brzydka” frakcja w porównaniu do „eleganckiej” 5/3.
Zatem celem jest teraz znalezienie ułamka a / b o najmniejszym mianowniku b, który po zaokrągleniu powoduje zaokrąglenie liczby dziesiętnej.
Detale
Dane wejściowe zawierają ciąg o liczbie od 1 do 5 cyfr, który zawiera się w przedziale od 0 (włącznie) do 10 (nie wliczając) ze znakiem „.” po pierwszej cyfrze. Powiedzmy, że n
oznacza liczbę cyfr. Dane wyjściowe muszą być listą / tablicą dwóch liczb całkowitych [numerator, denominator]
lub racjonalnym typem danych (możesz utworzyć własny lub użyć wbudowanego), gdzie licznik jest nieujemny, a mianownik jest dodatni. Licznik ułamkowy / mianownik musi być równy wartości wejściowej, jeśli jest prawidłowo zaokrąglony do n
cyfr (co oznacza n-1
cyfry po przecinku dziesiętnym).
Ograniczenie: dozwolona jest tylko jedna instrukcja pętli. Oznacza to, że możesz użyć tylko jednej instrukcji pętli (jak for
lub while
lub goto
itp.), A także pętli funkcjonalnych, takich jak map
lub, fold
które stosują kod do każdego elementu listy / tablicy) w całym kodzie, ale możesz go „nadużyć” lub użyj rekurencji itp.
Powinieneś napisać funkcję. Jeśli twój język nie ma funkcji (a nawet jeśli tak jest), możesz alternatywnie założyć, że dane wejściowe są przechowywane w zmiennej (lub dane wejściowe przez stdin) i wydrukować wynik lub zapisać go w pliku. Najmniejsza liczba bajtów wygrywa.
Zaokrąglanie
Zaokrąglanie powinno odbywać się zgodnie z „konwencjonalnymi” regułami zaokrąglania, tj. Jeśli ostatnia cyfra, która zostanie odcięta, to 5 lub więcej, zaokrąglisz w górę i zaokrąglisz w dół dla innych przypadków, np .:
Podczas zaokrąglania do wyniku będzie 4.5494
- 1 cyfra: 5
- 2 cyfry: 4.5
- 3 cyfry: 4,55
- 4 cyfry: 4.549
Przykłady
Podaj następujące przypadki testowe i inne „interesujące”:
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))
jest równoważne z map(f, map(g, numbers))
. Wersja funkcjonalna używa map
dwa razy, czy naprawdę należy to zabronić?
repeat
tworzy nieskończoną listę argumentów. Wydaje się, że zapętla się, ale faktycznie ma złożoność czasową O (1). Ale myślę, że sortowanie każdego przypadku z osobna jest lepsze niż niedozwolone języki funkcjonalne.