Quando si converte una frazione in un numero decimale e si desidera memorizzare quel numero, spesso è necessario arrotondarlo perché si desidera utilizzare solo una determinata quantità di memoria. Supponiamo che sia possibile memorizzare solo 5 cifre decimali, quindi 5/3 diventano 1.6667. Se riesci a memorizzare solo 2 cifre decimali, sarà 1,7 (ora supponendo che sia sempre compreso tra 0 e 9.99 ...).
Se ora provi a invertire quel processo con 1.7 e vuoi recuperare la tua frazione, questo può essere difficile, poiché sai che 1.7 è solo un numero arrotondato. Ovviamente puoi provare il 17/10 ma questa è piuttosto una frazione "brutta" rispetto all'elegante 5/3.
Quindi l'obiettivo è ora trovare la frazione a / b con il minimo denominatore b, che si traduce nel numero decimale arrotondato quando arrotondato correttamente.
Dettagli
L'input contiene una stringa con un numero da 1 a 5 cifre compreso tra 0 (incluso) e 10 (escluso) con un '.' dopo la prima cifra. Diciamo che n
indica il numero di cifre. L'output deve essere un elenco / matrice di due numeri interi [numerator, denominator]
o un tipo di dati razionale (è possibile crearne uno proprio o utilizzare incorporato) in cui il numeratore non è negativo e il denominatore è positivo. Il numeratore / denominatore della frazione deve essere uguale all'input se arrotondato correttamente alle n
cifre (il che significa n-1
cifre dopo il punto decimale).
Limitazione: è consentita solo un'istruzione loop. Ciò significa che è possibile utilizzare solo una singola istruzione di ciclo (come for
o while
o goto
ecc. Nonché cicli funzionali come map
o fold
che applicano codice a ogni elemento di un elenco / array) nell'intero codice, ma si è liberi di "abusarne" o usa la ricorsione ecc.
Dovresti scrivere una funzione. Se la tua lingua non ha funzioni (o anche se lo è), puoi in alternativa supporre che l'input sia memorizzato in una variabile (o input tramite stdin) e stampare il risultato o scriverlo in un file. Vince il numero più basso di byte.
Arrotondamento
L'arrotondamento dovrebbe seguire le regole di arrotondamento "convenzionali", ovvero se l'ultima cifra che verrà tagliata è 5 o maggiore, arrotonderai per eccesso e arrotonderai per tutti gli altri casi, ad esempio:
4.5494 risulterà quando si arrotondano a
- 1 cifra: 5
- 2 cifre: 4.5
- 3 cifre: 4,55
- 4 cifre: 4.549
Esempi
Si prega di includere i seguenti casi di test e altri "interessanti":
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))
equivale a map(f, map(g, numbers))
. La versione funzionale usa map
due volte, dovrebbe davvero essere vietato?
repeat
crea un elenco infinito del suo argomento. Sembra che abbia un ciclo ma in realtà ha una complessità temporale di O (1). Ma suppongo che l'ordinamento di ciascun caso singolarmente sia meglio che non consentire linguaggi funzionali.