Este problema tão simples dá-nos a oportunidade de falar uma vez mais sobre como chegar ao programa a partir do enunciado do problema. Em primeiro lugar, temos que identificar os
dados e o
resultado. Como o que se pretende saber é se um dado número é perfeito, fica claro que o dado é o número e o resultado é um indicador (True ou False) que nos sinaliza se o número é perfeito ou não. Em segundo lugar, temos que perceber o modo de comunicação entre o programa e o seu ambiente. O enunciado por ou não impor um tipo específico de comunicação. Por exemplo, pode dizer “Escreva um programa em que é pedido ao utilizador...”, ou “... e imprima o resultado”. Nestes casos ficava claro que os dados eram introduzidos pelo utilizador (input, raw_input) e os resultados seriam impressos (print). Nado nos é dito, pelo que vamos supor que os dados são comunicados via
parâmetros formais e os resultados são devolvidos através de
return. Em terceiro lugar, devemos preocupar-mo-nos com a representação dos objectos. Aqui é trivial: são números e booleanos. Em quarto lugar, vamos responder à questão de como ligar os dados ao resultado, isto é, qual o processo (ou algoritmo) que nos vai permitir resolver o problema. Uma abordagem metodológica simples consiste na divisão do problema principal em sub problemas:
1. Calcular os divisores
2. Calcular a soma dos divisores
3. Testar se o número é igual à soma dos seus divisores (excluindo o próprio número!)
Com o que sabemos ainda não estamos em condições de resolver as questões 1. e 2. em separado. Para tal teríamos que guardar os divisores nalgum lado! Por isso, vamos juntar os dois passos em apenas um, calculando os divisores e mantendo associado a uma variável a soma dos divisores já encontrados.
def perfeito(n):
"""Determina se um número inteiro positivo é perfeito, isto é,
igual à soma dos seus divisores próprios."""
# 1. 2.: divisores e soma
soma = 0
for i in range(n):
if (n % i) == 0:
soma = soma + i
# 3. Testa e devolve resultado
return soma == n
Sem comentários:
Enviar um comentário