Il tuo compito è, dato x
, output 2*x
. Facile vero !? Ma c'è un problema: x
verrà data come una frazione continua (forse infinita) e l'output deve essere una frazione continua. L'ingresso è garantito per essere un numero algebrico reale il cui grado è al massimo 2.
Input : la frazione continua di x
. Questo è diviso in 3 parti: la parte intera, il prefisso e la parte ripetuta. La parte intera è costituita da un singolo numero intero. Il prefisso e la parte ripetuta sono matrici (possibilmente vuote) di numeri interi positivi che descrivono il prefisso e la parte ripetitiva della frazione continua. Ad esempio, l'input (3, [1], [2, 4])
rappresenta la frazione continua [3; 1, 2, 4, 2, 4, ...]
.
Se la parte ripetuta è vuota, ciò indica un numero razionale. Ad esempio, (3, [1, 2], [])
rappresenta [3; 1, 2] = 11/3
. Devi accettare entrambe le forme di un numero razionale (cioè (3, [1, 1, 1], [])
, che [3; 1, 1, 1] = 11/3
dovrebbe essere anche un input valido).
Output : emette la frazione continua del doppio dell'input, nello stesso formato dell'input. Se l'output è razionale, è possibile generare l'una o l'altra forma della frazione continua. Fintanto che la risposta equivale alla risposta corretta, va bene; non è necessaria alcuna "compressione", quindi la parte infinita potrebbe essere "srotolata" un po '(ad esempio, [1; 4, 2, 3, 2, 3...]
può essere scritta (1, [4], [2, 3])
o (1, [4, 2, 3], [2, 3])
). Tutte le risposte devono essere esatte.
Casi di prova : la colonna del modulo esatto è indicata per comodità.
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])
E, infine, un banco di prova leggermente più grande per garantire la precisione: (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])
.
Vince il codice più corto!
Suggerimento : è possibile eseguire l'aritmetica in modo piuttosto semplice sulle frazioni continue come descritto qui . Raddoppiare una frazione continua è solo un caso speciale di questo algoritmo (anche se la parte difficile potrebbe essere quella di trovare quando la frazione continua si ripete).
Sqrt[2]
.
[3; 1, 1, 1]
sarebbe (3, [1, 1, 1], [])
nel formato di input che stiamo usando - quindi la domanda dovrebbe probabilmente menzionarlo in quel formato (nel terzo paragrafo), solo per garantire chiarezza.
(-2, [1, 5, 2], [6, 2])
un output accettabile per l'input (-1, [2], [2, 1])
? Che ne dici (-2, [1, 5, 2, 6, 2, 6], [2, 6])
?