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 n
denota 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 n
dígitos (o que significa n-1
dí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 for
ou while
ou goto
etc., bem como loops funcionais como map
ou fold
que 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 map
duas vezes, isso realmente deve ser proibido?
repeat
cria 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.