Número de Harshad Um número de Harshad (ou Niven) é um número inteiro divisível pela soma dos seus próprios dígitos. Implemente um programa que faça esta verificação.
Exemplo: 18 é Harshad pois
, e 18 é divisível por 9 .
Exemplo: 18 é Harshad pois
Passo 1
O que o enunciado pede e quais informações temos:
- Pede-se implementar um programa que verifique se um inteiro é um número de Harshad (também chamado de Niven).
- A definição: um inteiro positivo
é Harshad se ele for divisível pela soma dos seus dígitos. - Entrada esperada: um inteiro
(o enunciado não especifica limites, então vamos tratar inteiros com sinal; explicito comportamento para casos especiais abaixo). - Saída esperada: uma indicação se
é Harshad ou não (o formato exato de saída cabe ao programa; no final vou fornecer uma implementação que imprime uma resposta legível).
Passo 2
Ideia matemática e critério de verificação (fórmula principal):
- Seja
o número dado e seja a soma dos dígitos de . - O critério é:
- Observação: se
a expressão é indefinida (divisão por zero). Isso ocorre somente quando todos os dígitos de são zeros, ou seja, quando . Portanto precisamos tratar separadamente.
Passo 3
Como calcular
(duas maneiras, explicadas passo a passo):
- Método 1 (usando string): converter
para string, percorrer cada caractere, converter de volta para inteiro e somar. É direto e legível. - Método 2 (usando aritmética inteira): repetir enquanto
: - pegar o último dígito com
, - acumular
, - remover o último dígito com
(em programação inteira: ). - No final
é .
- pegar o último dígito com
- Exemplo numérico detalhado (para ver “na prática”):
. - Começando com
: último dígito . Soma parcial . Atualiza . - Agora
: . Soma . Atualiza . - Para
obtivemos . Verificação: → 18 é Harshad.
- Começando com
Passo 4
Decisões de implementação e tratamento de casos especiais (o que meu programa fará):
- Se a entrada
for negativa, faz sentido usar o valor absoluto para testar Harshad, porque os dígitos de são os mesmos de . Então usarei para computar . - Caso
: todos os dígitos são zero e . A divisão por zero é indevida, então o programa deve escolher um comportamento. Vou optar por considerar que NÃO é Harshad (porque a definição exige divisibilidade por soma dos dígitos, e a soma é zero — não se pode dividir). O programa tratará esse caso imprimindo que não é Harshad. - Para
: calcular e verificar . Se sim, imprimir que é Harshad; caso contrário, imprimir que não é Harshad.
Passo 5
Complexidade e justificativa prática (o que esperar sobre tempo/uso de memória):
- Calcular a soma dos dígitos percorre cada dígito uma vez: se
é o número de dígitos de , o tempo é . Como , isso é muito rápido. - Uso de memória é constante
(apenas algumas variáveis auxiliares). - Portanto o método é eficiente e adequado mesmo para números grandes (desde que caibam no tipo inteiro usado).
Passo 6
Sugestões de entradas e saídas de teste (para validar o programa):
- Entrada
→ soma dos dígitos , → saída: Harshad. - Entrada
→ soma , → saída: não Harshad. - Entrada
→ tratar como → saída: Harshad. - Entrada
→ soma , divisão indefinida → saída: não Harshad (conforme escolha aqui).
Esses testes cobrem casos normais, negativo e o caso limite zero.
Passo 7
Boas práticas na implementação:
- Validar a leitura da entrada (tratar espaços, fim-de-linha).
- Usar funções pequenas: por exemplo uma função que recebe um inteiro e retorna True/False se é Harshad — facilita testar e reutilizar.
- Evitar dividir por zero checando
antes de testar a divisibilidade. - Escolhi apresentar a saída em português com mensagens claras: imprimir exatamente “Harshad” quando for e “Nao Harshad” quando não for (evitei acento em “Nao” para compatibilidade com diferentes terminais).
Resposta
# Programa em Python que verifica se um número é Harshad (Niven)
# Lê um inteiro da entrada e imprime "Harshad" ou "Nao Harshad"
import sys
def eh_harshad(n: int) -> bool:
m = abs(n)
if m == 0:
return False # definição: tratar 0 como não Harshad (evita divisão por zero)
s = 0
while m > 0:
s += m % 10
m //= 10
if s == 0:
return False
return abs(n) % s == 0
def main():
data = sys.stdin.read().strip()
if not data:
return
try:
n = int(data.split()[0])
except ValueError:
print("Entrada invalida")
return
if eh_harshad(n):
print("Harshad")
else:
print("Nao Harshad")
if __name__ == "__main__":
main()