Solução em Python do Problema 11

#------------------------------------------------------------------
# Solução 1: Usa uma variável indicadora de passagem (booleana) 
#            é_primo
#
#------------------------------------------------------------------
def main():
    '''
    Programa que lê um inteiro positivo n e imprime uma mensagem
    indicando se ele é ou não triangular.

    Observacao: um número inteiro é primo se ele é maior do que 1
        e seus únicos divisores são ele mesmo e 1. 
        Assim, 1 não é primo.

    Exemplos de execução

    Digite o valor de n (n > 0): 1
    1 não é primo

    Digite o valor de n (n > 0): 4
    4 não é primo

    Digite o valor de n (n > 0): 27644437
    27644437 é primo
    '''

    print("Determina se um número n > 0 é primo\n")

    # leia o valor de n
    n = int(input("Digite o valor de n (n > 0): "))

    # n é primo até que se prove o contrário
    é_primo = True

    # procure por um divisor de n entre 2 e n-1
    divisor = 2
    while divisor < n and é_primo: # equivalente a "div... and é_primo == True:"
        if n % divisor == 0:
            é_primo = False
        divisor += 1
  
    
    if é_primo and n != 1: # 1 não é primo
        print(n, "é primo")
    else:
        print(n, "não é primo")

  
# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
main()

#------------------------------------------------------------------
# Solução 2: Conta os divisores de n entre 1 e n
#            
#------------------------------------------------------------------
def main():
    '''
    Programa que lê um inteiro positivo n e imprime uma mensagem
    indicando se ele é ou não triangular.

    Observacao: um número inteiro é primo se ele é maior do que 1
        e seus únicos divisores são ele mesmo e 1. 
        Assim, 1 não é primo.

    Exemplos de execução

    Digite o valor de n (n > 0): 1
    1 não é primo

    Digite o valor de n (n > 0): 4
    4 não é primo

    Digite o valor de n (n > 0): 27644437
    27644437 é primo
    '''

    print("Determina se um número n > 0 é primo\n")

    # leia o valor de n
    n = int(input("Digite o valor de n (n > 0): "))

    # inicialize o contador de número divisores de n
    cont_divisores = 0

    # conta o número de divisores entre 1 e n
    for divisor in range(1,n+1):
        if n % divisor == 0:
            cont_divisores += 1 

    # imprima mensagem
    if cont_divisores == 2:
        print(n, "é primo")
    else:
        print(n, "não é primo")

# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
main()

#------------------------------------------------------------------
# Solução 3: Essencialmente idêntica à solução 1,  um pouco mais
#            eficiente já que dentro do while só testa divibilidade
#            por números ímpares.
#
#------------------------------------------------------------------
def main():
    '''
    Programa que lê um inteiro positivo n e imprime uma mensagem
    indicando se ele é ou não triangular.

    Observacao: um número inteiro é primo se ele é maior do que 1
        e seus únicos divisores são ele mesmo e 1. 
        Assim, 1 não é primo.

    Exemplos de execução

    Digite o valor de n (n > 0): 1
    1 não é primo

    Digite o valor de n (n > 0): 4
    4 não é primo

    Digite o valor de n (n > 0): 27644437
    27644437 é primo
    '''

    print("Determina se um número n > 0 é primo\n")

    # leia o valor de n
    n = int(input("Digite o valor de n (n > 0): "))

    # n é primo até que se prove o contrário
    if n == 2 or (n != 1 and n % 2 == 1): # 2 é primo , 1 não é primo
        é_primo = True
    else:
        é_primo = False  # pares maiores que 2 não são primos

    # procure por um divisor ímpar de n entre 2 e n-1
    divisor = 3
    while divisor < n and é_primo: # equivalente a "div ... and é_primo == True:"
        if n % divisor == 0:
            é_primo = False
        divisor += 2 
  
    
    if é_primo: 
        print(n, "é primo");
    else:
        print(n, "não é primo");

# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
main()

#------------------------------------------------------------------
# Solução 4: Essencialmente idêntica à solução 3,   um pouco mais
#            eficiente já que dentro do while só testa divibilidade
#            por números ímpares menores que n//2.
#     
#            Poderíamos ainda usar o fato de que se um número
#            n possui um divisor maior que 1, então ele possui
#            um divisor maior que 1 e menor ou igual a raiz quadrada
#            de n.
#
#------------------------------------------------------------------
def main():
    '''
    Programa que lê um inteiro positivo n e imprime uma mensagem
    indicando se ele é ou não triangular.

    Observacao: um número inteiro é primo se ele é maior do que 1
        e seus únicos divisores são ele mesmo e 1. 
        Assim, 1 não é primo.

    Exemplos de execução

    Digite o valor de n (n > 0): 1
    1 não é primo

    Digite o valor de n (n > 0): 4
    4 não é primo

    Digite o valor de n (n > 0): 27644437
    27644437 é primo
    '''

    print("Determina se um número n > 0 é primo\n")

    # leia o valor de n
    n = int(input("Digite o valor de n (n > 0): "))

    # n é primo até que se prove o contrário
    if n == 2 or (n != 1 and n % 2 == 1): # 2 é primo , 1 não é primo
        é_primo = True
    else:
        é_primo = False  # pares maiores que 2 não são primos

    # procure por um divisor ímpar de n entre 2 e n-1
    divisor = 3
    while divisor < n // 2 and é_primo: # equivalente a "div ... and é_primo == True:"
        if n % divisor == 0:
            é_primo = False
        divisor += 2 
  
    
    if é_primo: 
        print(n, "é primo");
    else:
        print(n, "não é primo");

# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
main()


Lista de Problemas

História da Computação | Listas de Exercícios | Problemas Resolvidos | macmulti@ime.usp.br