Posts: 2.014
Threads: 72
Joined: Jan 2007
ora bem... Eu tenho já a base do trabalho. O trabalho é em linguavem C à base de números primos e preciso de ajuda para o resolver.
Ora... Eu tenho isto:
Array#include <stdio.h>
int main (void){
int menu, n, i,p;
while (menu !=0){
printf ("1 - Introduza novo numero\n");
printf ("2 - Primo?\n");
printf ("3 - Lista de primos\n");
printf ("4 - Maior primo\n");
printf ("5 - Conta pares de primos gemeos\n");
printf ("0 - Sair\n");
printf ("Opção:");
scanf ("%d",&menu);
if (menu==0)
printf ("bye bye\n");
if (menu==1){
printf ("Numero: ");
scanf ("%d",&n);
}
if (menu==2){
p=0;
for (i=2 ; i<=n ; i++) {
if ((n%i)==0)
p=p+1;
}
if (p==2)
printf("Numero primo\n");
else
printf("Não primo\n");
} /*fim do menu=2*/
if (menu==3){
p=0;
for (i=2 ; i<=n ; i++) {
if ((n%i)==0)
p=p+1;
if (p==2){
while (p<n){
printf (" %d \n",p++);
}}
}
}
} /*fim do while*/
return 0;
}[/quote]
Mas quando tenho menu==3 queria que ele me dissesse os nums primos até ao numero que inserirmos no menu==1.
Alguém me pode ajudar?
Posts: 1.028
Threads: 12
Joined: Jan 2009
epah nao percebo um car***o disso :dots:
Posts: 1.387
Threads: 26
Joined: Apr 2007
Só vi meio por alto a tua função, mas pelo que pude observar, a expressão que usas para determinar o "grau de parentesco" do número é esta:
Arrayif (menu==2){
p=0;
for (i=2 ; i<=n ; i++) {
if ((n%i)==0)
p=p+1;
}
if (p==2)
printf("Numero primo\n");
else
printf("Não primo\n");
} /*fim do menu=2*/[/quote]
Se percebi correctamente a pergunta que fizeste, a solução seria aplicar a mesma expressão a todos os números naturais menores ou iguais do que o número que foi introduzido, será que algo deste género resultaria?
for(int x=1;x<=n;x++) <- inicializamos a variável x (neste caso foi declarada já dentro do "for", mas depois fazes como preferires ou como foi ensinado nas aulas) que usamos para avaliar se o número verifica as condições.
{
p=0; <- por cada ciclo fixamos este valor em zero, para verificar quantas vezes o número é divisível por outro menor.
for(int i=1;i<=x;i++) { <- na tua função, o valor mínimo de i=2, mas não deveria ser 1? Porque p=2 só se verifica quando o número é divisível por ele próprio e por 1 (ou seja, quando é primo).
if((x%i)==0) <- esta expressão, suponho, devolve o resto da divisão inteira e compara o resultado com 0.
p++;
}
if(p==2)
printf("%d\n",x);
}
Há formas mais práticas e rápidas de conseguir o mesmo resultado, mas tudo depende do que foi ensinado nas aulas.
Nunca estudei C, por isso espero não te ter induzido em erro.
Posts: 540
Threads: 48
Joined: Oct 2006
Epá, eu posso estar a errar mas não tenho maneira de comprovar o que estou a dizer por isso, aqui vai disto.
Estes dois bocados de codigo que tens são um pouco estranhos, a meu ver. parece que estás a complicar o não tanto complicado.
for (i=2 ; i<=n ; i++) { (isto é um ciclo for, como deves saber. que, pelo que dizes aqui começa em 2 e vai até quando i for <= a n... a minha pergunta é, queres mesmo que comece em 2? não será melhor for (i=0, i<n, i++)?)
if ((n%i)==0) (isto compara na 1ª volta do ciclo o teu n com 2... até aqui tudo bem.. se der resto 0 a dividir por 2 já não é primo, logo não precisas de na 2ª volta dividir por 3... não tem mta logica, acho.
Mas pronto, eu tb tou um pouco ferrugento nisto e não tenho muito tempo.
Experimenta:
p=1;
While (p<n){
p=p+1;
if ((p%2)!=0)
print( "%d \n",p);
}
Posts: 2.014
Threads: 72
Joined: Jan 2007
obrigado a todos, mas agora o problema já vem sobre o ponto 4.
Posts: 1.387
Threads: 26
Joined: Apr 2007
ArrayEpá, eu posso estar a errar mas não tenho maneira de comprovar o que estou a dizer por isso, aqui vai disto.
Estes dois bocados de codigo que tens são um pouco estranhos, a meu ver. parece que estás a complicar o não tanto complicado.
for (i=2 ; i<=n ; i++) { (isto é um ciclo for, como deves saber. que, pelo que dizes aqui começa em 2 e vai até quando i for <= a n... a minha pergunta é, queres mesmo que comece em 2? não será melhor for (i=0, i<n, i++)?)
if ((n%i)==0) (isto compara na 1ª volta do ciclo o teu n com 2... até aqui tudo bem.. se der resto 0 a dividir por 2 já não é primo, logo não precisas de na 2ª volta dividir por 3... não tem mta logica, acho.
Mas pronto, eu tb tou um pouco ferrugento nisto e não tenho muito tempo.
Experimenta:
p=0;
While (p<n){
p=p+1;
if ((p%2)==0)
print( "%d \n",p);
}[/quote]
Há várias formas de fazer isto, mas parece-me que a ideia do Alexandre é obter o resto da divisão inteira de n por todos os números naturais iguais ou menores que esse para assim verificar se o número é primo, algo que só acontece quando p=2 (quando o número é divisível apenas por si próprio e por 1), já que a variável p é incrementada sempre que a divisão dá resto zero. Pareceu-me que faz sentido o valor mínimo de i ser 1, já que a divisão por zero é irrelevante e, dentro desta lógica, é necessário dividir o número por ele próprio para obter o valor correcto de p, assim o ciclo não poderia cessar antes de n.
o_Õ
Posts: 1.387
Threads: 26
Joined: Apr 2007
Arrayobrigado a todos, mas agora o problema já vem sobre o ponto 4.[/quote]
Ora, no ponto quatro vai testando os números todos de n até 1, já que vamos testando os números por ordem descrescente, o primeiro que for primo, será o maior. :D
Posts: 907
Threads: 52
Joined: Dec 2004
A minha proposta já com o ponto 4 implementado:
Array#include <stdio.h>
#include <math.h>
int num_primo( int num ) {
int n;
num = abs( num );
if( num == 0 ) {
return 0;
}
if( num == 1 ) {
return 1;
}
for ( n=2; n<num; n++ ) {
if( (num % n) == 0 )
return 0; // não é número primo
}
return 1; // é número primo
}
int main( void ) {
// regra de ouro: inicializar sempre as variáveis
// é preferível declarar cada variável na sua linha
// evita erros e facilita a manutenção
int menu = -1;
int num = 0;
int num_tmp = 0;
while( menu != 0 ) {
printf ("\n1 - Introduza novo numero\n");
printf ("2 - Primo?\n");
printf ("3 - Lista de primos\n");
printf ("4 - Maior primo\n");
printf ("5 - Conta pares de primos gemeos\n");
printf ("0 - Sair\n");
printf ("Opção:");
scanf ("%d",&menu);
if( menu == 0 ) {
printf( "bye, bye!\n\n" );
return 0;
}
if( menu == 1 ) {
printf( "\nNumero?: " );
scanf("%d", &num);
}
if( menu == 2 ) {
if( num_primo( num ) )
printf( "Número %d é primo!", num );
else
printf( "Número %d não é primo!", num );
}
if( menu == 3 ) {
if( abs(num) > 0 ) {
printf( "\n\nListagem de números primos de 1 a %d.", num );
printf( "\n" );
for( num_tmp = 1; num_tmp <= num; num_tmp++ ) {
if( num_primo( num_tmp ) )
printf( "%d\n", num_tmp );
}
}
else
printf( "\n\nO número tem que ser maior que 0." );
}
if( menu == 4 ) {
if( abs( num ) > 0 ) {
for( num_tmp = num; num_tmp > 0; num_tmp-- ) {
if( num_primo( num_tmp ) ) {
printf( "O maior número primo de 1 a %d é %d.", num, num_tmp );
break;
}
}
}
else
printf( "\n\nO número tem que ser maior que 0." );
}
}
}[/quote]
Espero que ajude... :blink1:
Posts: 2.014
Threads: 72
Joined: Jan 2007
Obrigado a todos, mas o trabalho já está concluido e entregue. Um obrigado especial ao JPC Barbosa que "praticamente" me fez o trabalho todo.:lol:
Posts: 427
Threads: 13
Joined: Sep 2006
Tás em todas JPC Barbosa.....
Uff....
|