Questăo 4 - Faça um programa que receba 30 números naturais. Seu programa deve exibir:
Os dois maiores valores digitados
Os dois maiores valores digitados
Passo 1
O enunciado pede que eu escreva um programa que receba
números naturais e exiba os dois maiores valores digitados.
Informações dadas:
Informações dadas:
- Devem ser lidos exatamente
números. - Os números são naturais (ou seja, não-negativos na forma usual).
- Saída: os dois maiores valores entre os
lidos (se houver repetições, pode ocorrer que os dois maiores sejam iguais).
Passo 2
Opções plausíveis para resolver (sem implementar ainda):
- Ler todos os
números, armazenar numa lista e ordenar a lista; então pegar os dois últimos elementos ordenados. Simples, mas usa memória e ordenação (custo maior). - Fazer em uma única passada (single-pass) mantendo apenas dois acumuladores: o maior e o segundo maior. É eficiente em tempo e memória e é a técnica que vamos usar — é básica, é rápida e fácil de aplicar numa prova.
Passo 3
Explicação detalhada do método escolhido (single-pass) — ideia e inicialização:
- Vou usar duas variáveis:
para o maior valor atual e para o segundo maior atual. Sempre manterei . - Inicialização robusta sem usar sentinela dependente do sinal: leio os primeiros dois números e os coloco em
e na ordem correta. Isso evita problemas se a definição de natural for ambígua. Depois, leio os restantes números e atualizo os acumuladores conforme abaixo.
Passo 4
Regras de atualização (para cada novo número
lido):
- Se
então: - faço
(o antigo maior vira segundo maior) - faço
(novo maior)
- faço
- Senão, se
então: - faço
- faço
- Caso contrário,
não entra entre os dois maiores e ignoro.
Observações sobre igualdade: - Se
então a primeira condição falha, mas a segunda condição pode ser verdadeira e inserir um igual como segundo maior — o que é desejável se houver repetição do maior valor.
Passo 5
Complexidade e robustez:
- A complexidade de tempo é
, ou seja, linear no número de entradas (na prática é constante, já que são entradas). - Usa
memória extra (apenas duas variáveis além da leitura). - Trata corretamente casos como todos os valores iguais, crescente, decrescente, e mistura qualquer.
- Se preferir uma solução por ordenação (mais simples de lembrar), ler numa lista e usar ordenação também funciona:
- ler lista
de tamanho , ordenar e pegar e . - mas isso exige guardar todos os valores.
- ler lista
Passo 6
Exemplo passo a passo (dry run) com números para fixar:
- Suponha que os primeiros
números lidos sejam, na ordem: (apenas um pedaço da entrada). - Leitura dos dois primeiros
e : organizo para , . - Lê
: como faço , . Agora , . - Lê outro
: não entra em (porque ), mas é verdade então . Agora , . - Lê
: não altera nada. - Lê
: não altera nada.
Resultado parcial após esses:, . Percebe que repetição do maior foi mantida como segunda maior — isso é correto.
Passo 7
Como escrever rapidamente isso na prova (passos práticos que você pode transcrever em código ou pseudocódigo):
- Ler
(primeiro número) e (segundo número). - Se
então , ; senão , . - Para
de até : - Ler
. - Se
: ; . - Senão se
: .
- Ler
- Ao final, imprimir
e .
Pronto — esse é o roteiro passo-a-passo para implementar em qualquer linguagem.
Resposta
# Programa em Python que lê 30 números naturais e exibe os dois maiores
# Leitura dos dois primeiros números e inicialização ordenada
a = int(input())
b = int(input())
if a >= b:
max_1 = a
max_2 = b
else:
max_1 = b
max_2 = a
# Ler os 28 números restantes e atualizar os dois maiores
for _ in range(28):
x = int(input())
if x > max_1:
max_2 = max_1
max_1 = x
elif x > max_2:
max_2 = x
# Exibir os dois maiores valores
print(max_1, max_2)