Ir para conteúdo

POWERED BY:

Arquivado

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

Endeavour

[Resolvido] Programa que cria lista de numeros primos Quase Pront

Recommended Posts

Fiz o programa mas ele abre e nao acontece nada se alguem puder me ajudar =D

A base do programa e' pegar numero por numero e checar o numero de divisores,

se for maior que 2 ele descarta, se for = 2 ele imprime na tela e vai pro pro'ximo.

Tambem ficaria muito agradecido se alguem me disse como tiro aquele goto ali.

Se eu colocar o main(); a variavel numero volta pro 1 e nao e' o que queremos.

Brigadao http://forum.imasters.com.br/public/style_emoticons/default/natal_laugh.gif

#include "stdafx.h"
#include <iostream>
using namespace std;

int checa( int );

int main()
{
	

	int numero;
	int divisor;
	numero = 1;
	point:
	if ( checa(numero) == 0){
		cout<< numero;
	}
	else {
		numero++;
			goto point;
}
}


int checa( int num )
{
	int divisores;
	int divisor;
	for (divisores = 0; divisores < 4;divisores ){
		for (divisor = num; divisor > 0; divisor--){
			if (num % divisor == 0){
			divisores++;
			}
		}
		}
	if (divisores > 2){
		return 1;
	}
	else {
		return 0;
	}

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Antes de tudo: retire esse goto! Não precisa usar isso.

 

Dá para mudar o checa, evitando entrar em loop em alguns casos:

 

Se um número for par e maior que 2, não é primo

Se tiver raiz quadrada exata não é primo

Se for 1, não é primo

 

Para verificar se é primo: fça um loop de 2 até )num - 1). Se "num" for divisível por alguns desses números, pode parar o loop e retornar que não é primo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não escreva programas com "goto" o código fica uma bagunça quando começa a crescer!!

 

troca isso por um while, por exemplo:

 

void ChecarPrimo(int numero) {
  int count=0, n=2;  

  while (n <= (numero / 2)) {
	if (numero % n == 0) {
	  count++;
	}
  }

if (count == 0) {
  printf("O número %d é primo", numero);
}
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito obrigado, usei o while funcionou perfeitamente.

Coloquei o a checagem de raiz, deve agilizar o processo.

Deveria tirar aquele outro goto que arrumei ali?

Se alguem tiver alguma dica de como fazer =D

 

--Edit--

#include "stdafx.h"
#include <iostream>
#include <math.h>
using namespace std;
void test(int);
void divisores(int);
int testpow(int);


int main()
{
	int numeroinicial;
	int numerofinal;
	cout<<"\nLista de numeros primos\nDigite o ultimo numero da lista\n->";
	cin>> numerofinal;
	cin.ignore();
	cout<<"Digite o numero inicial\n->";
	cin>> numeroinicial;
	cin.ignore();
	while (numeroinicial < numerofinal) {
	test(numeroinicial);
	numeroinicial++;
	}
	cin.get();
}

void test( int num ) {
	int div = 0;
	if ( testpow(num) == 0 )
		goto ponto;
	else {
	int divisor;
	divisor = 1;
	while ( div <= 3 && divisor < num) {
		while (divisor <= num ) {
			if ( num % divisor == 0 ) {
				div++;
					divisor++;
			}
			else {
				divisor++;
			}

		}
	}
ponto:
	if ( div == 2 )
		cout<<"\n "<< num <<"\n ";
	}
	
}

int testpow( int pownum )
{
	float powresult = pow (pownum, 0.5);
	int powintresult = static_cast< int >( powresult );
	if (powresult - powintresult == 0)
		return 0;
	else
		return 1;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

tipo...meu while tem um errinho...

falta colocar um

n++

caso contrário, ele ta um loop infinito!

=P

 

peço desculpas

 

 

e para checar números primos, você só precisa checar até o número divido por dois, por exemplo

quais são os divisores de 50?

1, 2, 5, 10, 25, 50

 

e os de 30?

1, 2, 3, 5, 6, 10, 15, 30

 

você percebeu que o maior divisor possivel de um número, é o número dividio por dois?

isso vai dexar teu código bem mais rápido.

Além do que, existem algumas funções matemáticas para trabalhar com primos, se você implementar elas vai ter uma melhora de performace notável!

=D

 

 

boa sorte!

Compartilhar este post


Link para o post
Compartilhar em outros sites

olha eu tbm como os outros ai de cima falaram, repito, naum use goto..

 

[]s

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.