• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

saramgsilva

Números primos

8 mensagens neste tópico

Eu era pra ter passado pra C++, so que nao tive tempo... e mas C esta contido em C++ ...e o codigo em sim nao tem grandes diferenças...

agora o comentario que faço do j ser menor ou igual que i, esta correcto, é para reforçar a ideia...nao estejes a confundir que j seria divisor de i...pode ser ou nao!ainda bem que percebeste o programa... :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas.

Descobri este site apenas ontem, increvi-me e tomei a liberdade de converter o programa do 'tofas' para c++ com classes.

Já tinha uma coisa feita para verificar se era primo ou não e acrescentei apenas o novo método.

Fica abaixo o código fonte com a implementação do 'tofas' no método descobre.

File primo.rar

File tofas.rar

File header - primo.h

//Classe Primo que permite o encapsulamento 
class Primo
{
// Dados privados da classe, só os métodos da classe acedem 
private:

int num;

public:

  //Construtor

virtual primo(int _num);
virtual descobre(int d_num);
};

File primo.cpp

#include <iostream>
#include "primo.h"
using namespace std;
// Implementação do método Primo
Primo :: primo(int _num)//recebe numero a testar
{

bool prime=true;//condição boolean inicializada em verdadeiro, o numero é primo até prova em contrário
for (int i=2; i<_num; i++)
	{

		if ((_num % i) == 0)//afinal não é primo			
		{	
			prime=false;//indicação que não é primo
			break;
		}

	}
cout << "\n";
cout << "\n";

if (!prime) 	cout << "O numero nao e' primo!\n";//teste da variavel boolean, - se não primo - 
else cout << " - O numero * " << _num << " * e' primo!!!" << endl;

cout << "\n";
cout << "\n";	

}

Primo ::descobre(int d_num)// Implementação do método descobre
{
int j,m,count;

for (j=1; j<d_num;j++)// j vai ser menor que o k dado
	{
		for (m=1, count=0;m<=j;m++) // m tem de ser menor ou igual 
		{		
			do 
			{
				if ((j%m==0) && m!=j && m!=1)// procurar o nº de divisores
						count++;
			}
			while(count==1);
		}// fim  do 2º for

		if(count==0 && j!=1)
			cout << " - O numero * " << j << " * e' primo" << endl;

	}// fim do 1º for
	cout << endl; //para separar do menu
}

File main.cpp

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

int main()
{

char menu;//variavel do menu
bool letra=false;//boolan controle caracter de entrada
bool sair=false;//boolean de saida
Primo p;//declaração do objecto que utiliza a classe e manipula os dados através dos métodos

while (!sair)// diferente de sair
	{
		cout << "***************************" << endl;//menu todo pipi
		cout << "*|-----------------------|*" << endl;
		cout << "*|  Teste numero primo   |*" << endl;
		cout << "*|-----------------------|*" << endl;
		cout << "*| (T)estar numero       |*" << endl;
		cout << "*| (V)is num primos ate k|*" << endl;
		cout << "*| (S)air                |*" << endl;
		cout << "*|-----------------------|*" << endl;
		cout << "***************************" << endl;
		cout << "\n";
		cout << "-> ";
		cin >> menu;
		cout << "\n";

		while(letra)
		{
			cout << "\n";
			cout << "-> ";
			cin >> menu;
			cout << "\n";
			if (menu =='t' || menu =='T' || menu == 's' || menu=='S' || menu=='v' || menu=='V') letra=true;
		}

		switch(menu)//baseado na condição que para c tudo o que for !=0 é verdadeiro
		{
		case ('t'):
		case ('T'):

			int numero;
			int erro;
			erro=0;
			cout << "Insira o numero: ";
			while (erro==0)// ciclo de 
			{
				fflush(stdin);//limpeza do buffer do teclado

				erro = scanf("%d", &numero);//verificação de inteiro feito com base em C, ainda não encontrei um substituto para C++
																		//devolve 0 ou 1 - caso leia correctamente devolve 1 e torna-se verdadeiro

					if (erro==0) cout << "Tem de ser inteiro natural: \n";
			}	
			p.primo(numero);// implementação do objecto com chamada do método
			break;


		case ('v'):
		case ('V'):

			int k;
			int erro_v;
			erro_v=0;
			cout << "Insira o valor de k: ";
			while (erro_v==0)// ciclo de 
			{
				fflush(stdin);//limpeza do buffer do teclado

				erro_v = scanf("%d", &k);//verificação de inteiro feito com base em C, ainda não encontrei um substituto para C++
																		//devolve 0 ou 1 - caso leia correctamente devolve 1 e torna-se verdadeiro

					if (erro_v==0) cout << "Tem de ser inteiro natural: \n";
			}	
			p.descobre(k);
			break;



		case ('s'):
		case ('S'):
			sair=true;// condição booleana de saída preenchida
			break;
		}
}
return 0;
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem vindo ao Forum! :) Espero que te ajude em tudo o que precisares e que possas tb partecipar activamente com a nossa comunidade! :D

ps: já agora,...

....tomei a liberdade de converter o programa do 'tofas' para c++ com

não é do, mas sim da :):P :P  ;)

wellcome! :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Peço desculpa á tofas, parti do pressuposto "Programador experiente".

:D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

hey zoltrix, isso está excelente.....  :shock:

hei-de lá chegar um dia... :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

obrigada zoltrix, é que o meu tempo livre tem sido pouco,e agora com a latada ainda pior...ja executei o teu programa...curti... o meu tem que ter algo pra parar, senao nao da pra ver nada...não analisei o codigo, mas com + calma vou faze-lo...

deixo aqui outro desafio...que por acaso tenho que fazer...mas quem kiser  tentar fazer...depois discutimos as resoluçoes:

Seja S(k) o conjunto dos numeros primos inferiores a k. Podemos verificar se os numeros n, tal que k <= n<=k*k, sao primos testando se tem ou nao divisores emS(k).
Problema:
1. Considere S(16) = {2, 3, 5, 7, 11, 13}. Escrever um programa
determinar sucessivamente os numeros primos ate n max.

o conjunto S(K) consigo encontra... é o que temos ate agora (criando um vector para guardar os primos...a que chamo S(k)... não esta aqui!!), nao consigo é calcular os n primos de k até k*k ... mais um desafio interessante!!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas.

Para fazeres parar o prog tens de inserir antes do return 0;   

    fflush(stdin);//limpeza do buffer do teclado senão fica lá com o enter e não pára se não tiver isto ou então adicionas 2 getchar
    getchar();

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

o que eu tinha proposto:

#include <iostream>

using namespace std;

#define MAX 100000

void imprime_vector(int p[], int n)
{ int i;
     for(i=0;i<n;i++)
       cout <<"numero primo:"<<p[i]<<endl;
}

int main()
{ int i,j,k,m, indice,n,conta_divisores, total ;
  int vaux[MAX], primos[MAX];
   cout <<"Introduza o valor de k=";
   cin >>k;
    
    for(i=1, m=0; i<=k ;i++) // i vai ser menor que o k dado
    { 
      for(j=1,conta_divisores=0; j<=i; j++) // j tem que ser inferior a i
    
     {  do
         { 
           if((i%j==0) && j!=i && j!=1) // aqui vou procurar o numero de divisores
                      conta_divisores++;
         }    
         while(conta_divisores==1);
     }// fim do 2º for  
     
     if(conta_divisores==0 && i!=1) 
         { primos[m]=i; m++;}              
     
     };// fim do 1º for
     
     
     // imprimir o conjunto S(k)
    cout<<"o conjunto S(k):"<<endl;
    imprime_vector(primos,m);
     
     // agora quero calcular os numeros primos tais que k <= n <= k*k 
     
     total=k*k-k;
     for(i=k;i<=k*k;i++)
      {vaux[i]=i;}
      n=m;
     for(i=0, indice=0; i<=total ;i++) 
    { 
      for(j=0,conta_divisores=0; j<n; j++) 
    
     {  do
         { 
           if((vaux[i]%primos[j]==0)) 
                      conta_divisores++;
         }    
         while(conta_divisores==1);
     }// fim do 2º for  
     
     if(conta_divisores==0) 
         {primos[m]=vaux[i];
          m++;
         //printf("%d esta no %d indice\n",primos[m],m);
         }              
     
     };// fim do 1º for
     
     cout<<endl<<"os n numero primos : k<= n<=k*k"<<endl;
     imprime_vector(primos+n,m-n);
     
     cout <<endl<<"o nmax="<<primos[m-1]<<endl;
     
     cout <<"prima um numero aleatorio para sair....";
     cin >>i; // só para parar o programa..
     return 0;
}
// fim do programa main

se alguem quiser comentar...  :D

fica aqui o executavel:  exe

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora