Jump to content
Sign in to follow this  
saramgsilva

Números primos

Recommended Posts

saramgsilva

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

Share this post


Link to post
Share on other sites
zoltrix

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;
}

Share this post


Link to post
Share on other sites
David Pintassilgo

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


cool stuffs to check.

http://blog.zxcoders.com//

Share this post


Link to post
Share on other sites
saramgsilva

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!!

Share this post


Link to post
Share on other sites
zoltrix

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();

Share this post


Link to post
Share on other sites
saramgsilva

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.