Questăo 4 - Faça um programa que receba 30 números naturais. Seu programa deve exibir:
Os dois maiores valores digitados

Passo 1

O enunciado pede que eu escreva um programa que receba 30 números naturais e exiba os dois maiores valores digitados.
Informações dadas:
  • Devem ser lidos exatamente 30 números.
  • Os números são naturais (ou seja, não-negativos na forma usual).
  • Saída: os dois maiores valores entre os 30 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 30 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: max_1 para o maior valor atual e max_2 para o segundo maior atual. Sempre manterei max_1 \ge max_2.
  • Inicialização robusta sem usar sentinela dependente do sinal: leio os primeiros dois números e os coloco em max_1 e max_2 na ordem correta. Isso evita problemas se a definição de natural for ambígua. Depois, leio os restantes 28 números e atualizo os acumuladores conforme abaixo.

Passo 4

Regras de atualização (para cada novo número x lido):
  • Se x > max_1 então:
    • faço max_2 \leftarrow max_1 (o antigo maior vira segundo maior)
    • faço max_1 \leftarrow x (novo maior)
  • Senão, se x > max_2 então:
    • faço max_2 \leftarrow x
  • Caso contrário, x não entra entre os dois maiores e ignoro.
    Observações sobre igualdade:
  • Se x = max_1 então a primeira condição falha, mas a segunda condição x > max_2 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 é O(30), ou seja, linear no número de entradas (na prática é constante, já que são 30 entradas).
  • Usa O(1) 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 L de tamanho 30, ordenar e pegar L[-1] e L[-2].
    • mas isso exige guardar todos os valores.

Passo 6

Exemplo passo a passo (dry run) com números para fixar:
  • Suponha que os primeiros 6 números lidos sejam, na ordem: 7, 3, 9, 9, 2, 5 (apenas um pedaço da entrada).
  • Leitura dos dois primeiros 7 e 3: organizo para max_1=7, max_2=3.
  • 9: como 9>max_1(=7) faço max_2\leftarrow7, max_1\leftarrow9. Agora max_1=9, max_2=7.
  • Lê outro 9: não entra em x>max_1 (porque 9\not>9), mas 9>max_2(=7) é verdade então max_2\leftarrow9. Agora max_1=9, max_2=9.
  • 2: não altera nada.
  • 5: não altera nada.
    Resultado parcial após esses: max_1=9, max_2=9. 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):
  1. Ler a (primeiro número) e b (segundo número).
  2. Se a \ge b então max_1 \leftarrow a, max_2 \leftarrow b; senão max_1 \leftarrow b, max_2 \leftarrow a.
  3. Para i de 1 até 28:
    • Ler x.
    • Se x > max_1: max_2 \leftarrow max_1; max_1 \leftarrow x.
    • Senão se x > max_2: max_2 \leftarrow x.
  4. Ao final, imprimir max_1 e max_2.
    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)

Exercícios relacionados