Jump to content

[Resolvido] Problema :programa para conferir numero primo


Inacabado
 Share

Recommended Posts

Muito boa noite a todos. Já vai algum tempo que não participo no forum, pois tenho andado ocupado com coisas... no entanto,

espero que tudo esteja pelo melhor com toda a gente!

Estive e fazer um programa para encontrar números primos no qual resolvi usar funções para treinar, no entanto o código está-me a

dar um comportamento estranho, o qual nem previa, nem consigo descobrir a causa.

O código é o que segue:

#include <iostream>
using namespace std;

int checkPrime(int);
int main()
{
	int n,i,a;
	cout << "insira o numero o qual pretende saber se é ou não número primo: \n";
	cin >> n;
	i=checkPrime(n);
	if (i==0)
			cout << i << " não é um número primo!\n";
	else
			cout << i << " É um número primo!\n";
return 0;
}

int checkPrime(int a)
{
	int i,p=0;
	for(i=2;i<=a/2;i++)
	{
			if(a==2)
					return p=1;
			else if(a%i==0)
					return p;
			else
					return p=1;
	}
}

O comportamento estranho é que me está a dar sempre independentemente do número n que coloque é este:

insira o numero o qual pretende saber se é ou não número primo:

n

1 É um número primo!

Ou seja independetemente do numero n que coloque diz-me sempre que inseri 1!!!

Agradecia imenso a vossa ajuda neste caso.

Abraço a todos e boa noite mais uma vez!

Edited by Inacabado
Link to comment
Share on other sites

HappyHippyHippo

Duas coisas: o que retorna a funcao que criaste? Porque e que estas a fazer output do resultado da funcao em vez do numero verificado?

PS: a funcao esta errada

Edited by HappyHippyHippo
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Porque e que estas a fazer output do resultado da funcao em vez do numero verificado?

corrigido esse era tão óbvio que me passou!

o que retorna a funcao que criaste?

PS: a funcao esta errada

Está-em a escapar qualquer coisa mas honestamente não consigo perceber porque é que a função está errada!

A função faz (em comentado):

int checkPrime(int a)// função de inteiros que recebe um inteiro a
{
	int i,p=0;// variável i para iteracção, variável p inicializada a 0 para nenhum primo encontrado
	for(i=2;i<=a/2;i++)//i vai até a/2 porque a partir daí o número é certamente primo
	{
			if(a==2)
					return p=1;// se a igual a 2 retorna o valor de 1 porque 2 é primo; foi encontrado 1 número primo.
			else if(a%i==0)// a a dividir por i resto zero então é divisivel por inteiro situado entre 2 e a
					return p;// por isso retorna 0 pois não é primo...
			else
					return p=1;// caso contrário o número é primo e devolve 1
	}
}

Não percebo mesmo o que está mal. Será que deveria usar um float???

Obrigado Hippo.

Edited by Inacabado
Link to comment
Share on other sites

Alterei ligeiramente código para:

#include <iostream>

using namespace std;

int checkPrime(int);
int main()
{
    int n,i,a;
    cout << "insira o numero o qual pretende saber se é ou não número primo: \n";
    cin >> n;
    i=checkPrime(n);
    if (i==0)
    {
		    cout << n << " não é um número primo!\n";
    }
    else if (i==1)
    {
		    cout << n << " É um número primo!\n";
    }
return 0;
}

int checkPrime(int a)
{
    int i,p=1;
    for(i=2;i<=a/2;i++)
    {
			 if(a%i==0)
				    return p=0;
				    break;
    }
    return p;
}

Não me dá mais aquele comportamento, mas algo está mal com este codigo/função até porque ao inserir o número 45 ele dá-me o mesmo como número primo,

o que está claramente errado pois 45 é divisivel por 3 ou 15 por exemplo...

Link to comment
Share on other sites

Certo já alterei o código eram realmente as chavetas!

Código correcto da função:

int checkPrime(int a)
{
 int i,p=1;
 for(i=2;i<=a/2;i++)
 {
			 if(a%i==0)
		 {
				 p=0;
				 break;
		 }
 }
 return p;
}

para que serve o uso das chavetas num código ?

como é avaliado o código de uma estrutura de controlo caso não é usado as chavetas ?

O uso das chavetas num código serve para isolar esse pedaço de código a fim de obter resultados pretendidos dentro desse bloco de código.

Se apenas tiver uma instrução não há necessidade de usar as chavetas.

Caso não se use as chavetas para diferenciar blocos de instrução fica tudo baralhado e obtêm-se muito possivelmente erros que não se estavam á espera.

No meu caso quando inseria o 45 e me dava como número primo isso era porque ele lia tudo seguido, não diferenciava e saia logo na primeira volta por causa do break.

Código correcto:

#include <iostream>

using namespace std;

int checkPrime(int);
int main()
{
	int n,i,a;
	cout << "insira o numero o qual pretende saber se é ou não número primo: \n";
	cin >> n;
	i=checkPrime(n);
	if (i==0)
	{
			cout << n << " não é um número primo!\n";
	}
	else if (i==1)
	{
			cout << n << " É um número primo!\n";
	}
return 0;
}

int checkPrime(int a)
{
	int i,p=1;
	for(i=2;i<=a/2;i++)
	{
			if(a%i==0)
			{
					p=0;
					break;
			}
	}
	return p;
}

Obrigado Hippo, obrigado por todos os que nos ajudas; abraço

Edited by Inacabado
Link to comment
Share on other sites

HappyHippyHippo

No meu caso quando inseria o 45 e me dava como número primo isso era porque ele lia tudo seguido, não diferenciava e saia logo na primeira volta por causa do break.

isto é para todos aqueles que ignoram uma resposta a um tópico que não é mais do que uma pergunta:

a pergunta é para direccionar o criador do tópico para o problema em questão. ignorar a pergunta é meio caminho andado para não obter ajuda no fórum.

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
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
 Share

×
×
  • 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.