sábado, 3 de outubro de 2009

Problema 1.19

Este problema é simples e consiste em determinar os divisores de um número inteiro n. Todos sabemos o que são divisores de um número: x diz-se divisor de y se o resto da divisão de y por x for zero. Passar da definição ao código é trivial.


def divisores(n):
"""
Mostra divisores de um número.
"""
for i in range(1,n+1):
if (n % i) == 0:
print i


O ciclo for (início na linha 5) vai gerando em sequência os candidatos a divisores. Na linha 6 a instrução condicional if testa e filtra os que são divisores.
Porque é que, na linha 5 range tem como argumentos 1 e n+1? Bom, a resposta é: porque serão gerados números de 1 a n, devido ao modo como range funciona. Mas não é a melhor solução! Melhor seria usar range(1,n/2). Porquê? Na linha 6, temos o início da instrução condicional mais simples de todas com a sintaxe:


if [condição]:
[bloco]


Podem também existir condicionais de duas vias, como em:


if [condição]:
[bloco_sim]
else:
[bloco_não]


ou mesmo de múltiplas vias:


if [condição_1]:
[bloco_1]
elif [condição_2]:
[bloco]_2
...
else:
[bloco_n]


A semântica desta última construção é a seguinte: percorremos de cima para baixo as condições, e executamos o código da primeira cujo resultado for True. Não havendo nenhuma condição verdadeira executa o bloco associado ao else.

3 comentários:

  1. boa noite, sou o rodrigo santos...
    continuei sem perceber a melhor opçao((1,n/2))
    cumprimentos

    ResponderEliminar
  2. É fácil. Pense num número. 10 por exemplo. Acha que vale a pena tentar divisores acima de 5? Claro que não! Não podem existir divisores maiores do que metade do número. Daí só testar os números até n/2.

    ResponderEliminar