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.

1.def divisores(n):
2.    """
3.    Mostra divisores de um número.
4.    """
5.    for i in range(1,n+1):
6.        if (n % i) == 0:
7.            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:

1.if [condição]:
2.    [bloco]


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

1.if [condição]:
2.    [bloco_sim]
3.else:
4.    [bloco_não]


ou mesmo de múltiplas vias:

1.if [condição_1]:
2.    [bloco_1]
3.elif [condição_2]:
4.    [bloco]_2
5....
6.else:
7.    [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