Solução em C do Problema 11

/* 
 * SOLUCAO 1. Simples, curta e grossa.
 *
 * Observacao.
 *   Um numero inteiro maior que 1 e primo se seus unicos
 *   divisores sao ele mesmo e 1. Assim, 1 nao e' primo.
 */

#include <stdio.h>

int main() 
{
  int n;       /* candidato a primo           */
  int divisor; /* candidato a divisor de n    */
  int cont;    /* conta o numero de divisores positivos de n */
  
  printf("\n\tTeste de primalidade\n");
  printf("\nDigite um inteiro: ");
  scanf("%d", &n);
  printf ("Candidato a primo = %d\n", n); 

  /* inicializacoes */
  cont = 0;

  /* os candidatos a divisores positivos de n sao 1,2,...,n */
  for (divisor = 1; divisor <= n; divisor++)
    {
      if (n % divisor == 0) 
	{
	  cont++;
	}
    }

  printf("O inteiro %d ", n);
  if (cont == 2)
    { /* este par de chaves e' superfluo, mas ha' que goste ;-) */
      printf("e' primo\n");
    }
  else
    {
      printf("nao e' primo\n");
    }
  return 0;
}

/* 
 * SOLUCAO 2. Mais elaborada e eficiente.
 *     Usa indicador de passagem, a variaval eprimo.
 *     Ao final do programa vale que eprimo == 0 
 *     se e somente se o numero dado nao e' primo.
 * 
 * Observacao.
 *   Um numero inteiro maior que 1 e primo se seus unicos
 *   divisores sao ele mesmo e 1. Assim, 1 nao e' primo.
 */

#include <stdio.h>

int main() 
{
  int n;       /* candidato a primo           */
  int divisor; /* candidato a divisor de n    */
  int eprimo;  /* indica se n ainda tem chance de ser primo */

  printf("\n\tTeste de primalidade\n");
  printf("\nDigite um inteiro: ");
  scanf("%d", &n);
  printf ("Candidato a primo = %d\n", n); 

  /* inicializacoes */
  if (n <= 1) 
    { 
      eprimo = 0; /* nenhum numero <= 1 e' primo */
    }
  else
    {
      eprimo = 1;  /* o numero e' primo ate que se prove o contrario */
    }

  /* os candidatos a divisores positivos de n sao 1,2,...,n/2 */
  divisor = 2;
  while (divisor <= n/2 && eprimo == 1)
    {
      if (n % divisor == 0) 
	{ 
	  eprimo = 0; /* n nao e' primo! */
	}
      divisor++;
    }

  printf("O inteiro %d ", n);
  if (eprimo == 1)
    { 
      printf("e' primo\n");
    }
  else
    {
      printf("nao e' primo\n");
    }
  return 0;
}

/* 
 * SOLUCAO 3. Identica a SOLUCAO 2. Apenas troca os 0'e e 1's
 *     por FALSE e TRUE, repectivamente.
 * 
 * Observacao.
 *   Um numero inteiro maior que 1 e primo se seus unicos
 *   divisores sao ele mesmo e 1. Assim, 1 nao e' primo.
 */

#include <stdio.h>
#define FALSE 0 
#define TRUE  1

int main() 
{
  int n;       /* candidato a primo           */
  int divisor; /* candidato a divisor de n    */
  int eprimo;  /* indica se n ainda tem chance de ser primo */

  printf("\n\tTeste de primalidade\n");
  printf("\nDigite um inteiro: ");
  scanf("%d", &n);
  printf ("Candidato a primo = %d\n", n); 

  /* inicializacoes */
  if (n <= 1) 
    { 
      eprimo = FALSE; /* nenhum numero <= 1 e' primo */
    }
  else
    {
      eprimo = TRUE;  /* o numero e' primo ate que se prove o contrario */
    }

  /* os candidatos a divisores positivos de n sao 1,2,...,n/2 */
  divisor = 2;
  while (divisor <= n/2 && eprimo == 1)
    {
      if (n % divisor == 0) 
	{ 
	  eprimo = FALSE; /* n nao e' primo! */
	}
      divisor++;
    }

  printf("O inteiro %d ", n);
  if (eprimo == TRUE)
    { 
      printf("e' primo\n");
    }
  else
    {
      printf("nao e' primo\n");
    }
  return 0;
}

/* 
 * SOLUCAO 4. Um pouco mais eficinte que as versoes anteriores.
 *     Testa se o numero e par fora do laco principal.
 *     Dentro do while so testa candidados a divisores impares.
 * 
 * Observacao.
 *   Um numero inteiro maior que 1 e primo se seus unicos
 *   divisores sao ele mesmo e 1. Assim, 1 nao e' primo.
 */

#include <stdio.h>
#define FALSE 0
#define TRUE  1

int main() 
{
  int n;       /* candidato a primo           */
  int divisor; /* candidato a divisor de n    */
  int eprimo;  /* indica se n ainda tem chance de ser primo */

  printf("\n\tTeste de primalidade\n");
  printf("\nDigite um inteiro: ");
  scanf("%d", &n);
  printf ("Candidato a primo = %d\n", n); 

  /* inicializacoes */
  if (n <= 1)
    {                
      eprimo = FALSE; /* nenhum numero <= 1 e' primo */
    }
  else 
    {
      if (n != 2 && n % 2 == 0)
        {
          eprimo = FALSE; /* nenhum numero par > 2 e' primo */
        }
      else
        { /* vale que n e' um impar maior que 1 ou e' 2 */
	  eprimo = TRUE;  /* o numero e' primo ate que se prove o contrario */
        }
    }

  /* os candidatos a divisores positivos de n sao 3,5,7,...,n/2 */
  divisor = 3;
  while (divisor <= n/2 && eprimo == 1)
    {
      if (n % divisor == 0) 
	{ 
	  eprimo = FALSE; /* n nao e' primo! */
	}
      divisor = divisor + 2;
    }

  printf("O inteiro %d ", n);
  if (eprimo == TRUE)
    { 
      printf("e' primo\n");
    }
  else
    {
      printf("nao e' primo\n");
    }
  return 0;
}

/* 
 * SOLUCAO 5. Uma SOLUCAO um pouco mais compacta da SOLUCAO 4.
 *     Usa comando for e a abreviatura += 
 * 
 * Observacao.
 *   Um numero inteiro maior que 1 e primo se seus unicos
 *   divisores sao ele mesmo e 1. Assim, 1 nao e' primo.
 */

#include <stdio.h>
#define FALSE 0
#define TRUE  1

int main() 
{
  int n;       /* candidato a primo           */
  int divisor; /* candidato a divisor de n    */
  int eprimo;  /* indica se n ainda tem chance de ser primo */

  printf("\n\tTeste de primalidade\n");
  printf("\nDigite um inteiro: ");
  scanf("%d", &n);
  printf ("Candidato a primo = %d\n", n); 

  /* inicializacoes */
  if (n <= 1 || (n != 2 && n % 2 == 0))
    {                
      eprimo = FALSE; /* nenhum numero inteiro <= 1 ou par > 2 e' primo */
    }
  else 
    {
      eprimo = TRUE;  /* o numero e' primo ate que se prove o contrario */
    }

  /* os candidatos a divisores positivos de n sao 3,5,7,...,n/2 */
  for (divisor = 3; divisor <= n/2 && eprimo == 1; divisor += 2)
    {
      if (n % divisor == 0) 
	{ 
	  eprimo = FALSE; /* n nao e' primo! */
	}
    }

  printf("O inteiro %d ", n);
  if (eprimo == TRUE)
    { 
      printf("e' primo\n");
    }
  else
    {
      printf("nao e' primo\n");
    }
  return 0;
}

/* 
 * SOLUCAO 6. Igual a SOLUCAO 5 depois de remover os parenteses superfluos.
 * 
 * Observacao.
 *   Um numero inteiro maior que 1 e primo se seus unicos
 *   divisores sao ele mesmo e 1. Assim, 1 nao e' primo.
 */

#include <stdio.h>

#define FALSE 0
#define TRUE  1

int main() 
{
  int n;       /* candidato a primo           */
  int divisor; /* candidato a divisor de n    */
  int eprimo;  /* indica se n ainda tem chance de ser primo */

  printf("\n\tTeste de primalidade\n");
  printf("\nDigite um inteiro: ");
  scanf("%d", &n);
  printf ("Candidato a primo = %d\n", n); 

  /* inicializacoes */
  if (n <= 1 || (n != 2 && n % 2 == 0))
    eprimo = FALSE; /* nenhum numero inteiro <= 1 ou par > 2 e' primo */
  else 
    eprimo = TRUE;  /* o numero e' primo ate que se prove o contrario */


  /* os candidatos a divisores positivos de n sao 3,5,7,...,n/2 */
  for (divisor = 3; divisor <= n/2 && eprimo == 1; divisor += 2)
    if (n % divisor == 0) 
      eprimo = FALSE; /* n nao e' primo! */
  

  printf("O inteiro %d ", n);
  if (eprimo == TRUE)
    printf("e' primo\n");
  else
    printf("nao e' primo\n");
    
  return 0;
}



Lista de Problemas

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