Programa em C

Iniciado por Rhyu, 03 de Janeiro de 2013, 20:25

tópico anterior - próximo tópico

Rhyu

Bom preciso 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.

Tentei o seguinte:

#include <stdio.h>

main ()

{

int n;
int i;
int j;
int primo_maior;
int primo_menor;
scanf ("%d",&n);
primo_maior == ((i%1 == 0) && (i%i == 0));
primo_menor == ((j%1 == 0) && (j%j == 0));

for (i = n ; i == primo_maior , i >= n ; i++)
{
   printf ("Primo maior %d\n",i);
    for (j = n ; i == primo_menor , j <= n ; j--)
     {
         printf ("Primo menor %d\n",j);

           break;
}
}


}


Fica dando erro Exceção de ponto flutuante (imagem do núcleo gravada) alguem sabe o que e isso?

Sergio Benjamim

Citação de: Rhyu online 03 de Janeiro de 2013, 20:25
Bom preciso 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.

Tentei o seguinte:

Citar#include <stdio.h>

main ()

{

int n;
int i;
int j;
int primo_maior;
int primo_menor;
scanf ("%d",&n);

// Vc não comenta seu código? Isso é importante.
// Tá dificil entender o q vc quis fazer aqui embaixo
//Vc não está confundindo atribuição (=) com comparação (==) ?

primo_maior == ((i%1 == 0) && (i%i == 0));
primo_menor == ((j%1 == 0) && (j%j == 0));

for (i = n ; i == primo_maior , i >= n ; i++)
{
  printf ("Primo maior %d\n",i);
   for (j = n ; i == primo_menor , j <= n ; j--)
    {
        printf ("Primo menor %d\n",j);

          break;
}
}


}

Fica dando erro Exceção de ponto flutuante (imagem do núcleo gravada) alguem sabe o que e isso?

dá uma olhada no meu comentário
É novo no Ubuntu? Já leu o Ubuntu – Guia do Iniciante 2.0 ?
Experimente o Xubuntu 14.04 !

Rhyu

Olha ai

#include <stdio.h>

main ()

{

int n;
int i;
int j;
int primo_maior;
int primo_menor;
scanf ("%d",&n);
primo_maior = ((i%1 == 0) && (i%i == 0)); //Função para primo maior
primo_menor = ((j%1 == 0) && (j%j == 0)); // Função para primo menor

for (i = n ; i == primo_maior , i >= n ; i++)   //Aqui a intenção era que o programa inicie em n e que ele imprima o primeiro numero primo
{                                               // maior ou igual a n
   printf ("Primo maior %d\n",i);
    for (j = n ; i == primo_menor , j <= n ; j--) //Iniciar em n e imprimir o primeiro numero menor ou igual a n
     {
         printf ("Primo menor %d\n",j);

           break;   //Como eu só quero o primeiro maior e primeiro menor , assim que ele achar o valor o programa termina.
}
}


}

irtigor

O i e j não foram iniciados. Conselho? Apague e reanalise o problema, veja:

- Primo = um numero natural que possui 2 divisores naturais, 1 e ele mesmo. Todo numero natural (inteiro não-negativo), é divisível natural de 1 e ele mesmo.

Rhyu

Bom consegui criar o programa para verificar se o numero e primo, mas e agora como faço para escolher o primeiro maior e o primeiro menor primo em relação a n

#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

}

irtigor

#5
Tá certo, mas você poderia iniciar i com 2 e ir até n-1, ai afirmava que é primo se nenhum numero fosse divisor natural. Pro restante:

- Crie um laço que vai de n até um numero grande, teste se o numero atual é primo, quebre o laço se positivo.
- Crie um laço que vai de n-1 até o inicio, teste se o numero atual é primo, quebre o laço se positivo.


-----
Em c existe o tipo inteiro sem sinal, ou seja, numero natural. É o unsigned int, que pelo padrão C99, em máquinas 32bits, vai pelo menos de 0 até 4,294,967,295.

Rhyu

Mas tipo eu vou ter que colocar esse laço para verificar se e primo dentro desse outros dois laços , ou descarto esse laço que eu criei?

irtigor

Os dois que eu falei não podem ser aninhados, e dentro de cada um é necessário verificar se o numero é primo. Siga o meu conselho, reanalise o problema, não adianta sair escrevendo código se você ainda não intendeu o que foi pedido.

Rhyu

Eu entendi o problema só que nao estou conseguindo estruturar o codigo , pensei no seguinte;

1) O programa lê o numero caso ele seja primo imprimi, caso nao seja incrementa a variavel e verifica dinovo se e primo só que nao estou conseguindo fazer.

#include <stdio.h>

main ()

{

int n;
int i;
int j;
int aux;
int divisor;
divisor = 0;

scanf ("%d",&n);
aux = 1;

while (divisor != 2)   //Caso o numero tenha mais de 2 divisores ele executa o for dinovo, mas nao ta dando certo;
{
  for (i = n ; aux <= i ; aux++)
  {
    if (i%aux == 0)
      divisor++;
  }
    i++;            //se o numero tem mais de 2 divisores ele incrementa o i pra testar dinovo

  }
  printf ("Primo\n");

}

irtigor

#9
Em pseudocódigo fica mais ou menos assim (primeira parte):


leia(n)

para (i=n, i < __numero-grande_, i++) faça // Começa em N e vai subindo
   marca=0 // Zera o marcador que vai dizer se o numero é primo ou não
   para (j=2, j < i, j++) faça // Verifica se é primo
       se i%j == 0
           marca=1 // Se entrou aqui é porque o numero é divisível por um natural diferente de 1 e ele mesmo
       fim
   fim
   se marca==0 // Se a marca continua zerada, é porque é primo
       escreva "O menor número primo que é maior ou igual n, é" i
        saia-do-para
   fim
// Terminou um ciclo, continua verificando: n+1, (n+1)+1, ((n+1)+1)...
fim



------
Você tirou esse exercício da onde? Se realmente intendeu o problema, eu recomendo que volte uns capítulos do livro/apostila.

Rhyu

Então é o seguinte eu estou cursando estatística e tenho uma disciplina obrigatoria onde tenho que aprender linguagem C, acontece que eu vou ter essa disciplina nesse primeiro semestre de 2013 só que como eu já tenho acesso ao material do curso já estou olhando e aprendendo , o problema é que esse material é extremamente básico são alguns slides que explicam de maneira resumida a linguagem C, e os exercicios não aparentam ser dos mais faceis.

Por isso já comecei a estudar , estou lendo Linguagem C Completa e total de Herbert Schildit (815 paginas) e encontrei um site onde tem video aulas sobre C também que estou usando como base para estudo.

irtigor

Dê uma procurada por material de lógica de programação, entenda bem e tudo vai fluir.

Rhyu

Vo da uma procurada sim, se tiver algum material pra indicar ai também é bem vindo.

Abraço

Rhyu

#13
Bom consegui resolver em partes aqui vai o codigo:

#include <stdio.h>

main ()

{
 int n;
 int aux ;
 int i;
 int j;
 int divisor;
 int divisor2;

 scanf ("%d",&n);

 while (divisor != 2) //Enquanto numero de divisores for diferente de 2 executa o laço
 {
   divisor = 0;
   aux = 1;
   for (i = n ; aux <= i ; aux++) // Teste pra ver se e primo
   {
     if (i % aux == 0)
       divisor ++;
   }
     if (divisor == 2)  //Se for primo para
       break;
     else
     n++;     //Caso não seja primo incrementa n
 }
       printf ("Primo maior %d\n",i);



       while (divisor2 != 2)  //Enquanto numeros de divisores for diferente de 2 executa o laço
       {
         divisor2 = 0 ;
         aux = 1 ;
         for (j = n ; aux <= j ; aux++)  //Teste pra ver se e primo
         {
           if (j % aux == 0)
             divisor2++;
         }
         if (divisor2 == 2)  //Se for primo para
           break;
         else
          n--;   //Se nao for primo decrementa variavel
       }
       printf ("Primo menor %d\n",j);
}



Esta imprimindo o primeiro primo maior que n normalmente , o problema esta em imprimir o primo menor. Acho que o problema é que apos ele encontrar o numero primo maior n passa a ser primo , entao ele automaticamente imprimi , mas no caso e o primo maior. Só que nao sei como resolver isso.

irtigor

#14
Sim, se você perde o valor digitado não tem como. Reveja o pseudocódigo, nele é um auxiliar que é incrementado, outro ponto (na mesma linha), é que eu defini um teto, você não pode incrementar indefinidamente (era essa a ideia? porque tá esquisito), os tipos possuem tamanhos.

----
Outra coisa, coloquei pra percorrer de 2 até n-1 porque é mais eficiente. Na há pra quê dividir N por 1 e ele mesmo, você sabe que vai dar certo (sempre).