Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

rhyu

Primo em C

Recommended Posts

Boa tarde pessoal, gostaria de ajuda para resolver o seguinte problema.

 

Escreva um programa que lê um número n, e então imprime o menor número primo que é maior ou

igual n, e imprime o maior primo que é menor ou igual a n.

 

consegui criar um programa para verificar se o numero e primo;

 

#include <stdio.h>

main ()

{

int n;
int i;
int divisor;
scanf ("%d",&n);
divisor = 0;  //Numero de divisores



for (i = 1; i <= n ; i++) //verifica o numero de divisores que N tem
{
 if (n%i== 0)

   divisor++;  //cada vez que n tem um divisor, incrementa a variavel divisor
}
 if (divisor == 2)
   printf ("Numero primo\n"); //se o numero de divisores é 2 entao e primo
 else
   printf ("Nao eh primo\n"); // se e diferente de 2 entao nao e primo

}

 

Mas como eu faço para escolher o primeiro primo maior que n e o primeiro primo menor que n?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Creio que o loop está errado.

O exercício pede que você imprima duas coisas, mas como não existe uma "fórmula mágica p/ saber qual é o próximo primo", a condição de parada é quando você encontrar o primeiro primo maior ou igual a n (e não "i<=n"), por exemplo.

 

Detalhe básico: 1 não é primo. E como não existem inteiros entre 0 e 1, se o usuário informar n = 1, você deve exibir uma mensagem de erro.

 

#include <math.h>
#include <stdio.h>
int main(void) {
 int lesser_prime;
 int greater_prime;
 int div_limit;
 int divisor;

 lesser_prime = greater_prime = n;


 // Primeiro primo  maior ou igual a n.
 while(1) {

	// Verificar divisores
	div_limit = (int) sqrt(greater_prime); // Reduz a quantidade de divisores a ser verificada.
	for(divisor = 2; divisor < div_limit && greater_prime % divisor != 0; divisor++);

	if (greater_prime >= n) then break;
	greater_prime++;
 };


 // Maior primo menor ou igual a n.
 if (greater_prime == n) then lesser_prime = n;
 else {
	lesser_prime = n - 1;

	// Aqui o limite inferior é 2 porque é o menor número primo conhecido.
	while (lesser_prime >= 2) {
   	div_limit = (int) sqrt(lesser_prime);
       for(divisor = div_limit; divisor > 1 && lesser_prime % divisor != 0; divisor--);
   	if (divisor == 1) then break;
   	lesser_prime--;
	}
 }

 printf("%d %d\n", lesser_prime, greater_prime);
 return 0;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.