Twoim zadaniem jest dane x
wyjście 2*x
. Łatwe, prawda !? Ale jest pewien haczyk: x
zostanie podany jako (być może nieskończony) ciągły ułamek , a wyjście musi być ułamkiem ciągłym. Dane wejściowe są gwarantowaną rzeczywistą liczbą algebraiczną, której stopień wynosi co najwyżej 2.
Wkład : ciągły ułamek x
. Jest on podzielony na 3 części: część całkowitą, przedrostek i część powtarzającą się. Część całkowita składa się z jednej liczby całkowitej. Przedrostek i powtarzająca się część są (być może pustymi) tablicami liczb całkowitych dodatnich, które opisują przedrostek i powtarzającą się część ciągłej części. Na przykład dane wejściowe (3, [1], [2, 4])
reprezentują ciągły ułamek [3; 1, 2, 4, 2, 4, ...]
.
Jeśli powtarzająca się część jest pusta, oznacza to liczbę wymierną. Na przykład (3, [1, 2], [])
reprezentuje [3; 1, 2] = 11/3
. Musisz zaakceptować obie formy liczby wymiernej (tzn. (3, [1, 1, 1], [])
Która [3; 1, 1, 1] = 11/3
powinna być również poprawnym wejściem).
Wyjście : wyjście ciągłego ułamka dwukrotności wejścia, w tym samym formacie co wejście. Jeśli dane wyjściowe są racjonalne, możesz wypisać dowolną formę ciągłego ułamka. Tak długo, jak odpowiedź jest odpowiednikiem poprawnej, jest w porządku; „kompresja” nie jest konieczna, więc nieskończona część może być „rozwinięta” nieco (np. [1; 4, 2, 3, 2, 3...]
może zostać napisana (1, [4], [2, 3])
lub (1, [4, 2, 3], [2, 3])
). Wszystkie odpowiedzi muszą być dokładne.
Przypadki testowe : Dokładna kolumna formularza jest podana dla wygody.
Input Exact Form Output
(0, [] []) 0 (0, [] []) or (-1, [1], [])
(-5, [1, 1], []) -4.5 (-9, [], []) or (-10, [1], [])
(3, [1, 2], []) 11/3 (7, [3], []) or (7, [2, 1], [])
(1, [], [2]) sqrt(2) (2, [], [1, 4])
(-1, [2], [2, 1]) -1/sqrt(3) (-2, [1, 5], [2, 6])
I wreszcie nieco większy przypadek testowy, aby zapewnić precyzję: (0, [1], [6, 1, 3, 1, 42, 1, 3, 1, 6, 2]) --> (1, [], [1, 2, 1, 8, 1, 20, 1, 8, 1, 2, 1, 2])
.
Najkrótszy kod wygrywa!
Wskazówka : Możesz wykonywać arytmetykę w dość prosty sposób na ciągłych ułamkach, jak opisano tutaj . Podwojenie ciągłego ułamka jest tylko specjalnym przypadkiem tego algorytmu (choć trudną częścią może być znalezienie, kiedy ciągły ułamek powtarza się).
Sqrt[2]
.
[3; 1, 1, 1]
byłby (3, [1, 1, 1], [])
w formacie wejściowym, którego używamy - więc pytanie powinno prawdopodobnie zawierać wzmiankę o tym formacie (w trzecim akapicie), aby zapewnić przejrzystość.
(-2, [1, 5, 2], [6, 2])
dane wyjściowe byłyby do przyjęcia (-1, [2], [2, 1])
? Jak o (-2, [1, 5, 2, 6, 2, 6], [2, 6])
?