Cuando convierte una fracción a un número decimal y desea almacenar ese número, a menudo tiene que redondearlo, porque solo desea usar una cierta cantidad de memoria. Digamos que solo puede almacenar 5 dígitos decimales, luego 5/3 se convierte en 1.6667. Si puede almacenar solo 2 dígitos decimales, será 1.7 (ahora suponiendo que siempre esté entre 0 y 9.99 ...).
Si ahora intenta revertir ese proceso con 1.7 y desea recuperar su fracción, eso puede ser difícil, ya que sabe que 1.7 es solo un número redondeado. Por supuesto, puedes probar 17/10, pero eso es más bien una fracción "fea" en comparación con el "elegante" 5/3.
Entonces, el objetivo ahora es encontrar la fracción a / b con el mínimo denominador b, que da como resultado el número decimal redondeado cuando se redondea correctamente.
Detalles
La entrada contiene una cadena con un número de 1 a 5 dígitos que está entre 0 (incluido) y 10 (no incluido) con un '.' después del primer dígito. Digamos que n
denota el número de dígitos. La salida debe ser una lista / matriz de dos enteros [numerator, denominator]
o un tipo de datos racional (puede crear el suyo propio o usarlo incorporado) donde el numerador no es negativo y el denominador es positivo. El numerador / denominador de fracción debe ser igual a la entrada cuando se redondea correctamente a n
dígitos (lo que significa n-1
dígitos después del punto decimal).
Restricción: solo se permite una declaración de bucle. Esto significa que puede usar solo una sola declaración de bucle (como for
o while
o goto
etc., así como bucles funcionales como map
o fold
que aplican código a cada elemento de una lista / matriz) en todo su código, pero puede 'abusar' de ella o usar la recursividad, etc.
Deberías escribir una función. Si su idioma no tiene funciones (o incluso si las tiene), puede suponer alternativamente que la entrada se almacena en una variable (o entrada a través de stdin) e imprimir el resultado o escribirlo en un archivo. El menor número de bytes gana.
Redondeo
El redondeo debe seguir las reglas de redondeo 'convencionales', es decir, si el último dígito que se cortará es 5 o mayor, redondeará hacia arriba y redondeará hacia abajo para cualquier otro caso, por ejemplo:
4.5494 resultará al redondear a
- 1 dígito: 5
- 2 dígitos: 4.5
- 3 dígitos: 4.55
- 4 dígitos: 4.549
Ejemplos
Incluya los siguientes casos de prueba y otros 'interesantes':
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))
es equivalente a map(f, map(g, numbers))
. La versión funcional usa map
dos veces, ¿debería eso realmente no permitirse?
repeat
crea una lista infinita de su argumento. Parece que se repite pero en realidad tiene una complejidad de tiempo de O (1). Pero supongo que ordenar cada caso individualmente es mejor que no permitir lenguajes funcionales.