Find number with smaller number of decimals between two other numbers

Asked

Viewed 134 times

2

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

Example: Number between 0.1234 and 0.1245. The answer is 0.124 Because it’s between the two numbers, and it has as few digits as possible.

Note: Open interval at both ends, that is, neither 0.1234 nor 0.1245 can 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 surely there is a more intelligent (and mathematical) way to perform such a procedure.

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

1 answer

0

The code below is commented for understanding:

# Define as variáveis
x = 10.1234
y = 10.1245

# Verifica e armazena quem tem menos digitos
lenmenor = len(str(x)) - len(str(int(x))) - 1
leny = len(str(y)) - len(str(int(y))) - 1
if lenmenor > leny:
    lenmenor = leny
print("len menor:", lenmenor)

# Define a média entre os valores
# E separa a parte fracionária caso precise calcular o len com ela também
media = (x + y) / 2
mediadec = str(media)[len(str(int(media))) + 1:]
print("media decimal:", mediadec)

# Print pra verificar a média e a média formatada com o len da media decimal
print("média entre os dois:", media)
print("média arredondada:{:.{len}f}".format(media, len=len(mediadec)))

# Código reduzido
x = 10.1234
y = 10.1245
lenmenor = len(str(x)) - len(str(int(x))) - 1
leny = len(str(y)) - len(str(int(y))) - 1
if lenmenor > leny:
    lenmenor = leny
media = (x + y) / 2
print("média arredondada:{:.{len}f}".format(media, len=lenmenor))

Browser other questions tagged

You are not signed in. Login or sign up in order to post.