Find number with the lowest number of decimal places between two other numbers

1

The final part for arithmetic data compression is to find a number, which is among 2 other numbers, and has the fewest digits / decimal places!

Example: Number between 0.1234 and 0.1245. The answer is 0.124 Because it is between the two numbers, and has the least number of possible digits.

Note: Interval open at both ends, ie neither 0.1234 nor 0.1245 may be the answer.

Can anyone think of an efficient solution to this problem?

I tried to make a hardcode of life, however, there are many cases, and there is certainly a smarter (and mathematical) way to do this.

def getNumberLessDigits(menor,maior):
"""
Função retorna o menor valor com menos dígitos entre os dois números passados como parâmetro.

:param menor:
:param maior:
:return: smallest integer with minimum of digits between the two numbers.
"""
if menor > maior:
    menor,maior = maior,menor

menor,maior  = list(str(menor)),list(str(maior))     # Vamos trabalhar lista de chars (Não pode ser "str" porque iremos dar append...)
dif          = abs(len(menor) - len(maior))          # Caso os dois números possuam tamanhos diferentes
menor        = ['0' for _ in range(dif)] + menor     # Completando com '0s', se necessário, no início do número

resultado = []
for i in range(len(menor)):

    # Enquanto os dígitos forem iguais, vamos simplemente continuar pro pŕoximo dígito:
    if menor[i] == maior[i]:
        resultado.append( menor[i] )
        continue

    # Quando temos a diferença de apenas 1 é treta! kkkkkk
    elif (int(maior[i]) - int(menor[i])) == 1:
        aux = resultado
        aux.append(maior[i])

        if int(''.join(maior)) > int(''.join(aux)):
            resultado = aux
            break
        else:
            resultado.append( menor[i] )

    # Quando o dígito do maior número é menor que o dígito do menor números, temos que somar 1 ao dígito anterior
    elif (int(maior[i]) - int(menor[i])) < 0:
        # TODO: Sempre que "maior" é 100% dá ruim
        # TODO: 10 vs 09 dá ruim... pois o menor seria 091
        # TODO: 160 vs 200 dá ruim também, pois, deveria ser 170 e não 200 (se for intervalo aberto).
        resultado[i-1] = str(int(resultado[i-1]) + 1)
        break

    # Qualquer outro caso, basta somar 1 no dígito atual:
    else:
        resultado.append( str(int(menor[i])+1) )
        break

resultado += ['0' for i in range(abs(len(resultado) - len(menor)))] # Completando com '0s' se necessário (até ficar do tamanho do menor)
resultado = int ( ''.join(resultado) )                              # Transformando a lista de chars em um número inteiro
return resultado
    
asked by anonymous 15.11.2018 / 21:54

0 answers