Fórum Ubuntu Linux - PT
Suporte Técnico => Programação e Scripts => Tópico iniciado por: Rhyu em 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:
#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?
-
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);
// 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
-
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.
}
}
}
-
O i e j não foram iniciados. Conselho? Apague e reanalise o problema, veja:
- Primo = um numero natural que só possui 2 divisores naturais, 1 e ele mesmo. Todo numero natural (inteiro não-negativo), é divisível natural de 1 e ele mesmo.
-
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
}
-
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.
-
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?
-
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.
-
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");
}
-
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.
-
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.
-
Dê uma procurada por material de lógica de programação, entenda bem e tudo vai fluir.
-
Vo da uma procurada sim, se tiver algum material pra indicar ai também é bem vindo.
Abraço
-
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.
-
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).
-
Então a ideia era ler o numero n ai ele testava n pra ver se ele tem mais de 2 divisores, caso ele tivesse ele incrementava n e testava dinovo, e assim sucessivamente ate encontrar o primeiro primo.
E que eu usei outro metodo pra verificar se e primo, nesse que voce sugere no caso ele começando em 2 e indo ate n-1 caso ele tenha algum divisor ele já nao e primo automaticamente ne?
-
Isso mesmo. Pra encontrar erros é bom usar um depurador (gdb, por exemplo), mas pode ser um pouco demais, dependendo de até onde você pretende/precisa ir. Dá pra fazer "no papel" também (desse você não deve escapar), chamado de teste de mesa (http://www.metropoledigital.ufrn.br/aulas/disciplinas/mat_aplicada/aula_09.html).
-
Bom primeiramente queria agracer a ajuda do irtigor para que eu conseguisse resolver o problema , segundo queria destacar que fiquei contente que mesmo com dicas consegui aprender bastante coisa.
#include <stdio.h>
main ()
{
int n;
int i;
int j;
int divisor;
scanf ("%d",&n); //Le o numero n
for (i = n ; i < 10000 ; i++) //incrementa i ate achar o primeiro primo
{
divisor = 0;
for (j = 2 ; j < i ; j++) //testar se e primo
{
if (i % j == 0)
divisor++;
}
if (divisor ==0) //se for primo para
break;
}
printf ("Primo maior %d\n",i); //imprimi o primo maior
for (i = n ; i < 10000 ; i--) //decrementa i ate achar o primeiro primo menor
{
divisor = 0;
for (j = 2 ; j < i ; j++) //testar se e primo
{
if (i % j == 0)
divisor++;
}
if (divisor == 0) //se for primo para
break;
}
printf ("Primo menor %d\n",i); //imprimi o menor primo
}
Acho que algo que ajudou bastante também foi ler logica de programação.
Abraço.
-
Duas coisas:
- Pra achar o maior primo que é menor ou igual a n, a condição de parada ideal é i>1 (ou i >=2), porque o numero dois é o menor numero inteiro não negativo também primo (e você tá indo em direção à ele, e não deve passar).
- Nesse problema, você pode quebrar o laço [que verifica se é primo] assim que encontrar o primeiro divisor. Só pra otimizar.