Lorsque vous convertissez une fraction en nombre décimal et que vous souhaitez stocker ce nombre, vous devez souvent l'arrondir, car vous ne souhaitez utiliser qu'une certaine quantité de mémoire. Disons que vous ne pouvez stocker que 5 chiffres décimaux, puis 5/3 devient 1,6667. Si vous ne pouvez stocker que 2 chiffres décimaux, ce sera 1,7 (en supposant maintenant qu'il est toujours compris entre 0 et 9,99 ...).
Si vous essayez maintenant d'inverser ce processus avec 1.7 et que vous souhaitez récupérer votre fraction, cela peut être difficile, car vous savez que 1.7 n'est qu'un nombre arrondi. Bien sûr, vous pouvez essayer le 17/10 mais c'est plutôt une fraction "moche" par rapport au 5/3 "élégant".
Le but est donc maintenant de trouver la fraction a / b avec le plus petit dénominateur b, ce qui donne le nombre décimal arrondi lorsqu'il est correctement arrondi.
Détails
L'entrée contient une chaîne avec un nombre de 1 à 5 chiffres compris entre 0 (y compris) et 10 (non compris) avec un '.' après le premier chiffre. Disons que n
dénote le nombre de chiffres. La sortie doit être une liste / un tableau de deux nombres entiers [numerator, denominator]
ou un type de données rationnel (vous pouvez créer le vôtre ou utiliser la fonction intégrée) où le numérateur est non négatif et le dénominateur est positif. Le numérateur / dénominateur de fraction doit être égal à l'entrée lorsqu'il est correctement arrondi à des n
chiffres (ce qui signifie des n-1
chiffres après la virgule décimale).
Restriction: une seule instruction de boucle autorisée. Cela signifie que vous ne pouvez utiliser qu'une seule instruction de bouclage (comme for
ou while
ou goto
etc. ainsi que des boucles fonctionnelles comme map
ou fold
qui appliquent du code à chaque élément d'une liste / tableau) dans tout votre code, mais vous êtes libre d'en abuser ou utiliser la récursivité, etc.
Vous devez écrire une fonction. Si votre langue n'a pas de fonctions (ou même si c'est le cas), vous pouvez également supposer que l'entrée est stockée dans une variable (ou entrée via stdin) et imprimer le résultat ou l'écrire dans un fichier. Le plus petit nombre d'octets gagne.
Arrondi
L'arrondi doit suivre les règles d'arrondi «conventionnelles», c'est-à-dire que si le dernier chiffre qui sera coupé est 5 ou plus, vous arrondirez et vous arrondirez vers le bas pour tous les autres cas, par exemple:
4,5494 résultera de l'arrondi à
- 1 chiffre: 5
- 2 chiffres: 4,5
- 3 chiffres: 4,55
- 4 chiffres: 4.549
Exemples
Veuillez inclure les cas de test suivants et d'autres cas «intéressants»:
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))
est équivalent à map(f, map(g, numbers))
. La version fonctionnelle utilise map
deux fois, cela devrait-il vraiment être interdit?
repeat
crée une liste infinie de son argument. I t semble boucler mais il a en fait une complexité temporelle de O (1). Mais je suppose que trier chaque cas individuellement est préférable à ne pas autoriser les langages fonctionnels.