(1 ponto) Faça um programa que receba um número inteiro
e um divisor
do usuário e escreva os números de 1 a
inclusive que são múltiplos de
, um por linha.
EXEMPLO
Entrada
Saída
10
3
3
6
9
EXEMPLO
| Entrada | Saída |
| 10 | 3 |
| 3 | 6 |
| 9 |
Passo 1
O que o problema pede e quais dados ele fornece:
- Pede: escrever um programa que receba um número inteiro
, e um divisor , fornecidos pelo usuário e escreva, um por linha, todos os números entre e (inclusive) que são múltiplos de . - Dados de entrada (exemplo do enunciado): primeira linha
, segunda linha . - Saída esperada no exemplo: linhas com
, , (cada número em sua própria linha).
Observação clara (importante): o enunciado fala em “divisor
do usuário” — vou assumir que
e que queremos os múltiplos de
que caibam no intervalo de
a
. Também considero útil aceitar
negativo, tratando-o pelo seu valor absoluto, já que ser múltiplo de
é a mesma coisa que ser múltiplo de
no conjunto dos inteiros dentro de
.
Passo 2
Ideia matemática simples para encontrar os múltiplos:
- Um número inteiro
é múltiplo de quando existe inteiro tal que . - Entre
e os múltiplos positivos de têm a forma com e . - Portanto
varia de até , onde (valor absoluto de ). Assim os múltiplos a imprimir são
Esse método gera só os múltiplos (não precisa testar cada inteiro de
a
), e é direto de implementar.
Passo 3
Explicação do operador que aparece frequentemente (o resto da divisão — “módulo”):
- Uma verificação alternativa é:
é múltiplo de se e somente se . - Aqui
significa o resto inteiro da divisão. Exemplo: , . - A ideia com a conta por
(Passo 2) evita usar o teste para cada e é geralmente mais eficiente e mais simples quando queremos listar múltiplos numa faixa.
Passo 4
Tratar casos especiais e suposições práticas:
- Se
não faz sentido perguntar por múltiplos de (divisão por zero). O programa pode simplesmente não produzir saída ou terminar. Vou optar por terminar sem imprimir nada nesse caso. - Se
então o intervalo está vazio e não há nada a imprimir. - Se
tomo (o mesmo conjunto de múltiplos positivos). - Supondo entradas razoáveis (dois inteiros), o algoritmo do Passo 2 funciona corretamente.
Passo 5
Transformando a ideia em passos computacionais (algoritmo):
- Ler todos os valores de entrada e converter para inteiros: obter
e . - Calcular
. - Se
ou : terminar sem imprimir nada. - Calcular
. (Em linguagens de programação com inteiros, isso é simplesmente .) - Para
variando de até (inclusive), imprimir em sua própria linha.
Comentário de clareza: usar a conta por
evita fazer
testes de módulo e gera exatamente os resultados desejados na ordem crescente.
Passo 6
Como implementar isso em código (detalhes passo a passo — vou usar Python pela simplicidade):
- Ler entrada: muitas vezes os testes fornecem os dois inteiros em linhas separadas; para tornar robusto, ler todo o stdin e separar por espaços/linhas.
- Converter para inteiro: usar int(…) para cada token.
- Usar d_abs = abs(d) para lidar com d negativo.
- Evitar divisão por zero verificando d_abs == 0.
- Calcular max_k = n // d_abs (divisão inteira).
- Fazer um laço for k in range(1, max_k + 1): print(k * d_abs).
Passo 7
Exemplo manual com os números do enunciado para checar a ideia:
- Dados:
, . -
. -
. Então . - Múltiplos:
, , . - Saída (cada um em linha): 3, 6, 9 — confere com o exemplo.
Passo 8
Complexidade e considerações finais para a prova:
- Complexidade: imprime
números e executa esse mesmo número de passos no laço. É muito eficiente quando comparado a testar todos os inteiros se for grande. - Implementação simples e direta; atenção às entradas (linha única ou múltiplas linhas) — a leitura por tokens resolve ambos os casos.
- Lembre-se de tratar
ou como casos que produzem nenhuma saída.
Resposta
import sys
tokens = sys.stdin.read().strip().split()
if len(tokens) < 2:
sys.exit(0)
try:
n = int(tokens[0])
d = int(tokens[1])
except Exception:
sys.exit(0)
d = abs(d)
if d == 0 or n < 1:
sys.exit(0)
max_k = n // d
for k in range(1, max_k + 1):
print(k * d)