(0.5) Elabore um programa em Python para encontrar um número inteiro que mais se aproxima da raiz quadrada de um número fornecido pelo usuário.
Passo 1
O enunciado pede: escrever um programa em Python que, dado um número fornecido pelo usuário, encontre um número inteiro que mais se aproxima da raiz quadrada desse número.
Informações relevantes fornecidas (explicitadas):
Informações relevantes fornecidas (explicitadas):
- O usuário fornece um número (vamos chamar de
). - Queremos encontrar um número inteiro que seja o mais próximo possível de
. - Saída esperada: um número inteiro (por exemplo, para
a raiz quadrada é aproximadamente , então a saída deve ser ou , dependendo de qual estiver mais perto).
Passo 2
Observações e casos especiais que precisamos considerar antes de codificar:
- Se
a raiz quadrada real não é definida. O programa precisa tratar esse caso (avisar o usuário ou interromper). - Se
então e o inteiro mais próximo é . - Se
for um quadrado perfeito (por exemplo ), então já é inteiro e devemos retornar esse inteiro. - Se
estiver exatamente no meio entre dois inteiros (por exemplo ), precisamos definir uma regra de desempate. Aqui vamos escolher, por simplicidade e previsibilidade, o inteiro menor (ou seja, o piso) em caso de empate.
Passo 3
Conceitos matemáticos necessários (explicados passo a passo):
- A raiz quadrada de
é . Em programação usamos uma função como math.sqrt(x)para calcular. - O piso de um número
é : o maior inteiro menor ou igual a . Em Python usamos math.floor(s). - O teto de
é : o menor inteiro maior ou igual a . Em Python usamos math.ceil(s). - Para saber qual inteiro (entre
e ) é o mais próximo de , comparamos as distâncias:
Se
escolhemos
. Se
escolhemos
. Se forem iguais (empate), pela regra acima escolhemos
.
- Observação sobre
round()do Python:round(s)resolve arredondamentos, mas em Python o empate (quando a parte fracionária é exatamente) segue a regra “round to even” (arredonda para o inteiro par), o que pode ser inesperado. Por isso vamos fazer a comparação explícita para termos controle total sobre o desempate.
Passo 4
Algoritmo (em palavras simples):
- Ler a entrada do usuário e converter para número (p. ex.
float). Chamar esse valor de. - Se
: avisar que a raiz real não está definida e terminar. - Calcular
. - Calcular
e . - Calcular
e . - Se
retornar , senão retornar .
(Isto implementa a escolha do piso em caso de empate.)
Passo 5
Implementação em Python — linha a linha com explicação:
- Vamos usar o módulo
mathparasqrt,flooreceil. - Função principal
nearest_int_sqrt(x): recebee devolve o inteiro mais próximo de ou lança erro/aviso se . - Função
main()faz a leitura do usuário, trata conversão, trata casoe imprime o resultado.
Exemplo do fluxo:
- Usuário digita
10→. Temos , . Distâncias: , . Como , retornamos . - Usuário digita
2,25→. , . Distâncias iguais e . Pelo desempate escolhemos .
Passo 6
Código completo e comentado (vai ser repetido sem comentários no bloco final):
- A explicação das linhas:
import mathimporta as funções matemáticas.- Em
nearest_int_sqrt(x)verificamos, calculamos s,l,u, calculamos as distâncias e retornamos conforme a comparação<=para escolher o piso em empate. - Em
main()usamosinput()para ler,float()para converter; tratamos exceçãoValueErrorcaso o usuário escreva algo inválido; tratamoscom mensagem clara; por fim imprimimos o inteiro encontrado.
Passo 7
Testes rápidos (mostrando cálculos):
- Para
: . Resultado: . - Para
: . , . Distâncias e . Resultado: . - Para
: . Distâncias iguais; pelo desempate retornamos .
Passo 8
Complexidade e observações finais:
- A complexidade é
: apenas algumas operações aritméticas e chamadas a funções matemáticas. - Garantimos comportamento previsível em empates (escolhemos o menor inteiro). Se você preferir outro desempate (por exemplo arredondar para cima), basta trocar a condição
<=por<.
Resposta
import math
def nearest_int_sqrt(x):
"""
Retorna o inteiro que mais se aproxima de sqrt(x).
Em caso de empate (por exemplo sqrt(x) = 2.5) retorna o piso (maior inteiro menor ou igual).
Lança ValueError se x < 0.
"""
if x < 0:
raise ValueError("Número negativo: raiz quadrada real não definida.")
s = math.sqrt(x)
l = math.floor(s)
u = math.ceil(s)
d_low = s - l
d_high = u - s
if d_low <= d_high:
return l
else:
return u
def main():
try:
entrada = input("Digite um número não-negativo: ").strip()
x = float(entrada)
except ValueError:
print("Entrada inválida. Digite um número (ex: 10 ou 2.5).")
return
if x < 0:
print("Número negativo. Raiz quadrada real não definida.")
return
resultado = nearest_int_sqrt(x)
print(resultado)
if __name__ == "__main__":
main()