Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Leandro Di Renzo

C Calcular quantos e quais números primos há entre 1 e outro número em linguagem C

Recommended Posts

Postado (editado)

Pessoal, eu não manjo de programação. Estou tentando fazer um programa em linguagem C que calcule quantos e quais números primos há entre 1 e um número que o usuário digitar. Pra fazer o programa rodar mais rápido, não quero incluir números pares nos laços de repetição. Não sei quais bibliotecas devo incluir.

 

Tentei compilar e executar o código abaixo no Dev-C++ 5.9.2 mas deu erro.

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


main() {
    int ultimo, dividendo, divisor, x, quantos;
    /* a variável "ultimo" guardará o último número do intervalo a ser calculado e será uma escolha do usuário
    a variável "x" contará quantas vezes os restos foram zero
    a variável "quantos" contará quantos números primos há no intervalo */


    printf(" Digite o ultimo numero do intervalo \n ");
    scanf("%f", &ultimo);
    printf(" Os numeros primos entre 1 e o numero que voce digitou sao: 1 \n ");
    printf(" 2 \n ");
    quantos = 0;
    for (dividendo=3; dividendo<=ultimo; dividendo+2) {
    /* para o programa calcular rapidamente quantos e quais são os números primos entre 1 e o número que o usuário digitou podemos deixar de verificar todos os números pares, pois sabemos que o único número par que é primo é o número 2, por isso o laço for acima começa em 3 e incrementa 2 a cada passada */
    x = 0;
        for (divisor=3; divisor<=ultimo; divisor+2) {
        /* como sabemos que todos os números positivos são divisíveis por 1 e que nenhum número primo é múltiplo de número par exceto o 2, não há necessidade de dividir nenhum número por 1 nem por nenhum número par */
        if ( dividendo % divisor==0 )    {
        x = x+1;                        
        if ( x==1 )    {
        printf(dividendo, "\n");
        quantos = quantos+1;            
                            }

                                                         }

                                                                         }
                                                                                    }
    printf("\n Quantidade de numeros primos no intervalo: ", quantos);                                                  
                 }

 

Quem sabe o(s) erro(s)?

Editado por Simon Viegas
Ao postar um código, favor utilizar a tag CODE, botao <>
  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites
Postado (editado)

@Leandro Di Renzo Olá!

Vejamos

printf(" Digite o ultimo numero do intervalo \n ");
scanf("%f", &ultimo);
printf(" Os numeros primos entre 1 e o numero que voce digitou sao: 1 \n ");
printf(" 2 \n ");

Comentário: Solicita-se ao usuário que entre com valor máximo para teste, e depois mensagem com resposta, mas não fez processo de teste algum ainda, por quê uma resposta? Deveria esperar o processo antes de responder. Outra coisa, a variável ultimo é do tipo int, melhor assim, o problema é que na scanf temos máscara para o tipo float  - está errado.

Spoiler

printf( "Digite o ultimo numero do intervalo \n" );
 scanf( "%d", &ultimo );
printf( " Os numeros primos entre 1 e o %d que voce digitou sao: ", ultimo );

 

  •  
quantos = 0;
for (dividendo=3; dividendo<=ultimo; dividendo+2) {
  /* para o programa calcular rapidamente quantos e quais são
     os números primos entre 1 e o número que o usuário digitou
     podemos deixar de verificar todos os números pares, pois
     sabemos que o único número par que é primo é o número 2,
     por isso o laço for acima começa em 3 e incrementa 2 a
     cada passada */

Comentário: Tirou onda nos comentário acerca de primos! :thumbsup:. Só erro no incremento do loop, mais uma vez está apenas somando com 2 não é incremento, tem que somar e atribuir logo após, da maneira que está se tem o chamando loop infinito.

Spoiler

for( dividendo = 3; dividendo <= ultimo; dividendo = dividendo + 2 )

 

  •  
x = 0;
for( divisor=3; divisor<=ultimo; divisor+2 ){
/* como sabemos que todos os números positivos são divisíveis por 1
   e que nenhum número primo é múltiplo de número par exceto o 2, não há
   necessidade de dividir nenhum número por 1 nem por nenhum número par */
     if( dividendo % divisor==0 )    {
        x = x+1;                        
        if( x==1 )    {
           printf(dividendo, "\n");
           quantos = quantos + 1; 

Comentário: Fez a lição de casa com relação os números primos :thumbsup:. Só errou no quesito C - sintaxe: Lembre-se que a função printf tem como principal e primeiro parâmetro uma string, seu protótipo é algo parecido com; printf( char *format, ... ); format:  é sempre uma string; uma máscara de dados ou mensagem e ainda os dois. Melhor coisa e remover essa mensagem, se preferir assim. Aqui também o mesmo erro loop infinito de erro lógico por conta do incremento.

Spoiler

for( divisor = 3; divisor <= ultimo; divisor += 2 )

 

  •  
printf("\n Quantidade de numeros primos no intervalo: ", quantos);
}

Comentário: Essa mensagem final não está dentro da logística; não combina com a primeira mensagem. Observe todas elas em sequência:

Os numeros primos entre 1 e o numero que voce digitou sao: 1
2
Quantidade de numeros primos no intervalo:

Isso não faz sentido! Concerte-as para que fica agradável ao usuário. Ainda faltou o return 0; que finaliza toda função main. Você tanto falou do 2 que acabou esquecendo a seguinte pergunta: O que acontece se ultimo for igual a 2?

Spoiler

   if( ultimo == 2 ) quantos = 1;
   printf( "%d\n", quantos );
   return 0 ;
}

  

 

  •  

"Pra fazer o programa rodar mais rápido"

Para mim, já é bem rápido, contudo podemos fazer alguns questionamentos:

  1. Por que o divisor está comparando, na proposição de Segundo For, com variável ultimo? e no mesmo For tem proposição IF com variáveis dividendo e divisor.  Ou seja,  divisor <= ultimo logo depois no IF dividendo % divisor , penso que o correto é:  divisor <= dividendo logo depois na cláusula IF dividendo % divisor. Exitem outras coisas mais, porém o custo benefício seria pequeno e relação as mudanças no algoritmo que seria muito maiores, deixa para lá!

 

Com esses detalhes já afinados fiz teste e ocorreu perfeitamente (realize outros mais)

 

Capturar.PNG

Spoiler

#include<stdio.h>  /* Dispõe as rotinas para entrada e saída       */


int main() {
   int ultimo, dividendo, divisor, x, quantos;
   /* a variável "ultimo" guardará o último número do intervalo a ser calculado e será uma
      escolha do usuário a variável "x" contará quantas vezes os restos foram zero
      a variável "quantos" contará quantos números primos há no intervalo */


   printf( " Digite o ultimo numero do intervalo \n " );
    scanf( "%d", &ultimo );
   printf( " Os numeros primos entre 1 e o %d que voce digitou sao: ", ultimo );

   quantos = 0;
   for ( dividendo = 3; dividendo <= ultimo; dividendo += 2 ) {
      /* para o programa calcular rapidamente quantos e quais são os números primos entre
         1 e o número que o usuário digitou podemos deixar de verificar todos os números
         pares, pois sabemos que o único número par que é primo é o número 2, por isso o
         laço for acima começa em 3 e incrementa 2 a cada passada */
      x = 0;
      for( divisor = 3; divisor <= dividendo; divisor += 2 ){
         /* como sabemos que todos os números positivos são divisíveis por 1 e que nenhum
            número primo é múltiplo de número par exceto o 2, não há necessidade de
            dividir nenhum número por 1 nem por nenhum número par */
         if( dividendo % divisor == 0 ){
             x = x + 1;
             if( x == 1 ){
                 quantos = quantos + 1;
            }

         }

      }
   }
   if( ultimo == 2 )
       quantos = 1;
   printf( "%d\n", quantos );
   return 0 ;
}

 

~~ / ~~

Editado por AnsiC
Formatação
  • Curtir 4

Compartilhar este post


Link para o post
Compartilhar em outros sites

AnsiC, obrigado pela atenção. Compilei e executei seu código e testei com o número 100. O programa mostrou a seguinte mensagem: Os numeros primos entre 1 e o 100 que voce digitou sao: 49

Não mostrou quais são os números primos entre 1 e 100 e não há 49 números primos entre 1 e 100.

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites
Postado (editado)
12 horas atrás, Leandro Di Renzo disse:

seu código

Código é meu, e a lógica é sua. O que você postou não estava compilando. Apenas troquei uma variável por outro que surtiu efeito nas repetições extras, se bem que não tenho certeza porque meu interesse era apenas em corrigir a sintaxe.

 

12 horas atrás, Leandro Di Renzo disse:

Não mostrou quais são os números primos entre 1 e 100 e não há 49 números primos entre 1 e 100.

Esse é seu problema desdo começo, porém com pouco mais de paciência alguém virá com a solução prontinha para você

 

 

Desculpa por não poder ajudar.

Minha intenção é fornecer correção apenas para sintaxe.

Aguarde mais um pouquinho que alguém vai lhe dar a resposta da questão ( lógica )

 

 

valeu!

~~ / ~~

Editado por AnsiC
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Leandro Di Renzo     o erro é na hora de calcular os números primos,  você está comparando o resto da divisão ,  mas isso não vai resolver ,    se você puder usar vetores  será mais fácil,   creio que seja melhor fazer por exclusão, então você coloca  o número 2 no inicio do vetor e depois coloca todos os números ímpares que esteja no intervalo de 1 até o número escolhido, em seguida exclui todos os números múltiplos de outro número que esteja no vetor, por exemplo 3 x 3 = 9 então exclui o número nove do vetor por colocar um zero no lugar onde está o número 9,  então precisa de dois vetores sendo um para colocar os números e outro para os múltiplos dos números que estão no primeiro vetor e depois ver qual número do primeiro vetor é igual ao número no segundo vetor e sendo igual então colocar zero no lugar , e na hora de imprimir, imprima apenas os que não for zero .    então o inicio pode ser assim 

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
using namespace  std;
int meu_vetor[1000],meu_vetor2[1000],q=1;
int main() {
    int ultimo, dividendo, divisor,r,w,i,x,k,quantos;
    /* a variável "ultimo" guardará o último número do intervalo */
    printf(" Digite o ultimo numero do intervalo e menor que 1000 ");
    scanf("%d",&ultimo);
    printf(" Os numeros primos entre 1 e o numero %d sao: \n",ultimo);
    quantos = 0;
    k=1;
    meu_vetor[0]=2;
    for(i=3;i<=ultimo;i+=2){
        meu_vetor[k] = i;
        k++;
    }
    printf("\n\n");
}

e vai precisar outro loop para calcular os múltiplos e outro para zerar os números no primeiro vetor e outro loop para imprimir os números e a quantidade de números primos no intervalo .

Compartilhar este post


Link para o post
Compartilhar em outros sites
Postado (editado)

devair1010 obrigado por responder. Eu consegui o que eu queria. O código ficou assim:

 

#include <stdio.h>

main() {
	int ultimo, dividendo, divisor, x, quantos;
	/* a variável "ultimo" guardará o último número do intervalo a ser calculado e 
	será uma escolha do usuário
	a variável "x" contará quantas vezes os restos foram zero
	a variável "quantos" contará quantos números primos há entre 1 e o número que o 
	usuário escolher */
	printf("Digite o ultimo numero do intervalo \n");
	scanf("%d", &ultimo);
	printf("\nOs numeros primos entre 1 e %d sao: \n", ultimo);
	printf("2 \n");
	quantos = 1;
	for (dividendo=3; dividendo<=ultimo; dividendo += 2) {
	/* para o programa calcular rapidamente quantos e quais são os números primos 
	entre 1 e o número que o usuário digitou podemos deixar de verificar todos os 
	números pares, pois sabemos que o único número par que é primo é o número 2, por 
	isso o laço for acima começa em 3 e incrementa 2 a cada passada */
	x = 0;
		for (divisor=3; divisor<=dividendo; divisor += 2) {
		/* como sabemos que todos os números positivos são divisíveis por 1 e que 
		nenhum número primo é múltiplo de número par exceto o 2, não há necessidade 
		de dividir nenhum número por 1 nem por nenhum número par */
		if (dividendo % divisor == 0)	{
		x = x+1;						}			      }
		if (x == 1) { 
		printf("%d\n", dividendo);
		quantos = quantos+1;
					}
												         }
	printf("\nQuantidade de numeros primos no intervalo: %d", quantos);												  
}

 

Editado por Leandro Di Renzo
  • Curtir 1

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






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

×