Ir ao conteúdo
  • Cadastre-se
Guilherme Guimarães97

C++ Problema: números primos, C++

Recommended Posts

Estou cursando curto técnico em informática e tenho que fazer uma tarefa que consiste no seguinte: O usuário vai digitar um número e tenho que mostrar todos os números primos de 0 até esse número. (Preciso usar obrigatoriamente o "enquanto")

Já tentei muito mas não consigo, ai esta meu código atual:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

    main() 
{
        int cont,i,r,d; 
    
    printf("Digite um numero qualquer: ");
    scanf("%d", &cont);
  
    i = cont;

    while (i >= 2){
        
        i= i-1;
        r= cont % i;
        
        if (r == 0)
            d = d + 1;
        if (i == 2 && cont > 0){
        cont = cont - 1;
        i = cont;
            if (d == 2){
                printf("%1.d\n ",cont);
                
            }
            d = 0;
                    
        }
    }

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá, amigo. Deu p fazer aqui d modo até rápido. Só q passar o código pronto seria sacanagem e seria bem ruim p você, pois não iria levar você a praticar sua lógica. 

A dica q eu posso dar é usar uma função para isso que retorne 0 se não é primo (por ex) e 1 caso seja primo, e aí dentro do while verificar os números usando essa função

Seria algo assim:

int i = 0;

while (i < num)

{

      if (ePrimo(i))

              // imprima o numero

      i++;

}

 

Com essa dica, se você souber criar uma função correta só os números primos até a número digitado seriam impressos

Ao meu ver ficou fácil assim

Experimenta fazer desse modo e se puder poste até onde chegou, ok?

adicionado 1 minuto depois

Caso não der p usar uma função crie uma igual e depois só faz a adaptação dentro do while

Compartilhar este post


Link para o post
Compartilhar em outros sites
6 minutos atrás, giu_d disse:

Olá, amigo. Deu p fazer aqui d modo até rápido. Só q passar o código pronto seria sacanagem e seria bem ruim p você, pois não iria levar você a praticar sua lógica. 

A dica q eu posso dar é usar uma função para isso que retorne 0 se não é primo (por ex) e 1 caso seja primo, e aí dentro do while verificar os números usando essa função

Seria algo assim:

int i = 0;

while (i < num)

{

      if (ePrimo(i))

              // imprima o numero

      i++;

}

 

Com essa dica, se você souber criar uma função correta só os números primos até a número digitado seriam impressos

Ao meu ver ficou fácil assim

Experimenta fazer desse modo e se puder poste até onde chegou, ok?

adicionado 1 minuto depois

Caso não der p usar uma função crie uma igual e depois só faz a adaptação dentro do while

Ainda não aprendi funções kkk, mas vou tentar

adicionado 23 minutos depois

To muito no inicio de C, so aprendi while, nada de array, função, for, nada disso. Acredito que devo fazer utilizando apenas while. voce conseguiu usando apenas isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá. Deu p fazer sim, mas para isso usei dois while, um dentro de outro. No while interno eu faço a verificação se o número é divisível por 1 e por ele mesmo. Se isso acontece o número é primo. Para saber isso é verificando se o resto da divisão do número por 1 é igual a 0 e se o resto da divisão do número por ele mesmo é 0 tbém. Essa verificação eu faço com um if() dentro do while interno. Seria algo assim:

 

while (j <= i)

{

     if (i % j == 0)

 

 

 

 

adicionado 13 minutos depois

Sendo sincero amigo, a vontade é de passar a resposta, mas aí não vou estar te ajudando em nada, pois acabaria não aprendendo nada. E aí mais tarde vai aparecer outro exercício e assim vai. Então o ideal é você exercitar  o uso da sua lógica desde já. A boa notícia é q com o tempo as coisas vão ficando mais claras e daí fica mais fácil resolver os exercícios q aparecem.

Editado por giu_d
Falha ao colocar a resposta

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não use o decremento como você fez acima, tipo  i = i - 1; . Trabalhe apenas com o incremento das suas variáveis. Vai ficar mais fácil fazendo assim para quem está começando a programar. 

inicio seu while desse modo (por ex):

 

int i = 1;

 

while (i <= num)

{

   // lógica a ser usada 

    i = i + 1;

}

adicionado 18 minutos depois

Vou passar a função q criei para ver se ajuda um pouco. Nessa função está a lógica q estou usando. 

Se você entender essa função vai conseguir resolver o exercício:

 

int ePrimo(int num)
{
    int div = 0, i;

    for (i = 1; i <= num; i++)
    {
        if (num % i == 0)
        {
            div++;
        }
    }

    if (div == 2 && num > 1)
    {
        return 1;
    }
    return 0;
}

Perceba que eu uso uma variável que chamei de div e inicio ela com zero. div++; é a mesma coisa que div = div + 1;

Dentro do for eu inicio a variável i com 1. Aí faço a verificação para saber se o número é divisível por 1 e por ele mesmo. Se isso acontece, a variável div, que valia 0 vai passar a valer 2, isso porque ela foi incrementada em 1 apenas 2 vezes, quando i valia 1 e quando i tinha o mesmo valor que num. É uma lógica bem simples e se conseguir entender essa função pronto

Quando um número é primo, eu retorno o valor 1, senão retorno o valor 0.

No caso do if onde uso a função, que seria: if (ePrimo(i))  seria a mesma coisa que fazer isso: if (ePrimo(i) == 1)

Mas acho q já dei muitas dicas e nem sei ao certo se estou ajudando ou não hehe

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vou passa a mesma função que criei mas dessa vez usando um while dentro da função. Tudo o q vai precisar fazer é criar um while que percorre todos os números de 1 até o número digitada e dentro desse while fazer a mesma coisa q fiz na função.

Segue o código da função:

 

int ePrimo(int num)
{
    int div = 0;
    int j = 1;

    while (j <= num)
    {
        if (num % j == 0)
        {
            div++; // aqui a variavel div,que começa valendo 0 é incrementada duas vezes no caso do número ser primo
        }
        j++;
    }

    if (div == 2 && num > 1)
    {
        return 1; // retorno 1 porque o numero e primo
    }
    return 0; // retorno 0 porque o numero nao e primo
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha, eu posso mandar a resposta. Mas o importante é q você entenda bem o q está sendo feito. Apenas copiar e colar o código não vai levar você a aprender a programar.

Mas não se preocupe. Encontrar dificuldade em um exercício como esse é mais q normal p quem está começando e ainda está estudando a respeito do while. O importante é praticar bastante. Faça o máximo d exercícios por dia q puder. Pode ser exercícios mais simples que esse, tal como saber se um número é primo ou não, saber se um número é par ou não, etc... 

Programação se aprende praticando! Fica o recado!

Só que vamos fazer o seguinte. Dê uma boa olhada no código e veja se você consegue entender o que está acontecendo.

Caso ficar alguma dúvida pergunte, ok?

 

#include <stdio.h>
  
  
int main()
{
    int num, i;

    printf("Digite um numero: ");
    scanf("%d", &num);

    printf("\n");

    int div;

    int j;

    i = 1;

    while (i < num)
    {
        div = 0;

        j = 1;

        while (j <= i)
        {
            if (i % j == 0)
            {
                div = div + 1;
            }
            j = j + 1;
        }

        if (div == 2 && i > 1)
        {
            printf("%d ", i);
        }
        i = i + 1;
    }

    printf("\n");

    return 0;

}

Seria isso amigo. Gostaria q tivesse conseguido resolver. Mas mesmo assim não desanime. Fazer um exercício como esse para quem está começando a programar e ainda está aprendendo a respeito do while não é mesmo uma tarefa tão simples assim. Como disse: Programação se aprende praticando! ok? 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Meu codigo estava bem perto disso mas por algum motivo nao funcionava, acho que errei na parte de encaixar a parte de verificar todos os numeros com a parte de ver se é primo. Mas consegui entender a logica sim, eu tava fazendo praticamente isso, obrigado pela ajuda. 

Vou tentar fazer do inicio sem olhar agora que entendi.

Realmente, esta sendo bem desafiador kk, comecei a aprender C agora, antes so usava VisualG, se fosse por la acredito que teria muito mais facilidade para resolver esse exercicio, mas praticando chegamos longe. Muito obrigado novamente

Editado por Guilherme Guimarães97

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá. Se conseguiu entender o código ótimo. Não é tão simples mesmo para quem está começando. E me anima muito ouvir que você chegou perto da resposta. É por aí mesmo.

Uma dica q posso dar e q costumo fazer é, quando me deparo com um exercício que aparenta ser difícil, procuro entender bem o que deve ser feito e aí saio da frente do computador e fico pensando sobre o exercício. Na maioria dos casos a resposta parece q vem pronta na mente.

Mas como eu disse: O negócio é praticar o máximo que puder.

E vou ser bem sincero. Pra mim, é muito mais fácil fazer um exercício como esse usando uma função do que dois whiles aninhados. 

Fico feliz em poder ter ajudado e em você ter entendido o código. Manda bala aí!

Abração!

adicionado 5 minutos depois

Obs: A boa notícia que tenho pra dar é que com o passar do tempo vai ficando cada vez mais fácil resolver os exercícios que vão aparecendo. Com o passar do tempo as coisas vão clareando. Lembre disso

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×