Quando você converte uma fração em um número decimal e deseja armazenar esse número, geralmente precisa arredondá-lo, porque deseja usar apenas uma certa quantidade de memória. Digamos que você possa armazenar apenas 5 dígitos decimais e 5/3 se tornará 1,6667. Se você puder armazenar apenas 2 dígitos decimais, será 1,7 (agora assumindo que esteja sempre entre 0 e 9,99 ...).
Se agora você tenta reverter esse processo com 1.7 e deseja recuperar sua fração, isso pode ser difícil, pois você sabe que 1.7 é apenas um número arredondado. Claro que você pode tentar 17/10, mas essa é uma fração 'feia' em comparação com a 'elegante' 5/3.
Portanto, o objetivo agora é encontrar a fração a / b com o mínimo denominador b, que resulta no número decimal arredondado quando corretamente arredondado.
Detalhes
A entrada contém uma sequência com um número de 1 a 5 dígitos que está entre 0 (inclusive) e 10 (não incluindo) com um '.' após o primeiro dígito. Digamos que ndenota o número de dígitos. A saída deve ser uma lista / matriz de dois números inteiros [numerator, denominator]ou um tipo de dados racional (você pode criar o seu próprio ou usar interno) em que o numerador não é negativo e o denominador é positivo. O numerador / denominador da fração deve ser igual à entrada quando arredondado corretamente para ndígitos (o que significa n-1dígitos após o ponto decimal).
Restrição: apenas uma instrução de loop é permitida. Isso significa que você pode usar apenas uma única instrução de loop (como forou whileou gotoetc., bem como loops funcionais como mapou foldque aplicam código a todos os elementos de uma lista / matriz) em todo o código, mas você pode 'abusar' dela ou use recursão etc.
Você deve escrever uma função. Se o seu idioma não possuir funções (ou mesmo se houver), você poderá assumir como alternativa que a entrada está armazenada em uma variável (ou entrada via stdin) e imprimir o resultado ou gravá-lo em um arquivo. O menor número de bytes vence.
Arredondamento
O arredondamento deve seguir as regras de arredondamento "convencionais", ou seja, se o último dígito a ser cortado for 5 ou superior, você arredondará para cima e arredondará para outros casos, por exemplo:
4.5494 resultará ao arredondar para
- 1 dígito: 5
- 2 dígitos: 4,5
- 3 dígitos: 4,55
- 4 dígitos: 4.549
Exemplos
Inclua os seguintes casos de teste e outros 'interessantes':
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))é equivalente a map(f, map(g, numbers)). A versão funcional usa mapduas vezes, isso realmente deve ser proibido?
repeatcria uma lista infinita de seus argumentos. Parece que faz um loop, mas na verdade tem complexidade de tempo de O (1). Mas acho que classificar cada caso individualmente é melhor do que não permitir linguagens funcionais.