
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;
}
História
da Computação | Listas de
Exercícios | Problemas Resolvidos | macmulti@ime.usp.br