Endeavour 0 Denunciar post Postado Dezembro 9, 2008 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
Beraldo 864 Denunciar post Postado Dezembro 9, 2008 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
Endeavour 0 Denunciar post Postado Dezembro 9, 2008 To ligado, depois vou fazer essas condicoes mas de inicio quero colocar isso pra funcionar, Se eu tirar o goto, o programa sai do loop, sai nao? Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Dezembro 9, 2008 Mas goto não é para fazer loops, a não ser que você use linguagem de baixo nível, como assembly, que não possuem loops Evite o uso de goto Compartilhar este post Link para o post Compartilhar em outros sites
VictorCacciari 42 Denunciar post Postado Dezembro 9, 2008 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
Endeavour 0 Denunciar post Postado Dezembro 10, 2008 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
VictorCacciari 42 Denunciar post Postado Dezembro 10, 2008 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
Endeavour 0 Denunciar post Postado Dezembro 17, 2008 Valeu pela dica, ficou pronto. Abracos Compartilhar este post Link para o post Compartilhar em outros sites
quitZAUMMM 18 Denunciar post Postado Dezembro 17, 2008 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