Jump to content
.Tigas.

Números Primos

Recommended Posts

.Tigas.

Boas, estou aqui com um problema. Tenho que fazer um programa que me dê os 10 primeiros números primos.

Eu fiz este:

Program primos;
uses crt;
var
        i, x, contar: integer;
Begin
        clrscr;

        for i:=1 to 10 do
          Begin
          contar:=0;
          for x:=1 to i do
          if (i mod x)=0 then
          contar:= contar + 1;
          If contar=2 then
          writeln (i);

          End;

readln;
End.

O problema é que isto dá-me os nºs primos de 1 até 10 e não os 10 números primos. Se eu meter "30" no "for i:= 1 to "10" dá-me os 10 primeiros números primos mas isso foi porque eu verifiquei a tabela dos números primos. Eu queria arranjar uma maneira "automática" de me dar os 10 números primos só de meter lá na instrução for i:= 1 to 10.

Share this post


Link to post
Share on other sites
herty

No for em vez de fazeres de 1 to 10 fazes de X to 10

Quando encontrares um nº primo aumentas o X + 1

Share this post


Link to post
Share on other sites
thoga31

O ciclo for é repetido continuamente. Não está a contar o nº de nºs primos encontrados, mas é sim uma variável que está a perticipar directamente nos cálculos.

// ...
var primos : integer; // conta nº de primos descobertos até agora
// ...

i:=2;
while (primos<10) do begin
      for x:=1 to i do begin
          if (i MOD x) then contar+=1;
      end;
      if (contar=2) then begin
         writeln(i);
         contar:=0;
         primos+=1;
      end;
      i+=1;
end;

Não estou com muito tempo para testar este código, mas experimenta. Espero que compreendas aquilo que fiz e o consigas comparar com o que fizeste. :D

Este post foi feito meio à pressa, por falta de time. :)

Cumpz. :thumbsup:


Knowledge is free!

Share this post


Link to post
Share on other sites
.Tigas.

Compreendi o que fizeste mas não funcionou. De qualquer forma consegui resolver o problema utilizando um until e dois contadores. Ora aqui está:

Program Primeiros_10n_primos_Repeat;
Uses crt;
Var
n, i, Contador, Contar: Integer;

Begin
        clrscr;
        Writeln('Os n£meros primos sÆo:');
        Contar:=0;
        for n:=1 to 300  do
                Begin
                        Repeat
                                Contador:=0;
                                for i:=1 to n do
                                        Begin
                                                If(n mod i)=0 then
                                                        Contador:=Contador+1;
                                        End;
                                If(Contador=2) then
                                        Begin
                                                Writeln(n);
                                                Contar:=Contar+1;
                                        End;
                        Until(Contar=10);
                End;
Readln;
End.

Obrigado aos dois pela ajuda. :)

Share this post


Link to post
Share on other sites
thoga31

Credo! Um for de 1 a 300? Para quê?

Comigo, o teu programa criou um loop, sem debitar qualquer resultado. Esteve mais de 15 minutos a rolar... A CPU já "ferve"... Estive a analisar e testar o código exaustivamente nos últimos minutos, e já percebi parte do porquê, mas não o seu todo. :dontgetit:

Ao obrigares o programa correr até n=300, acontece que o ciclo Repeat é realizado pois a condição é analisada apenas em ÚLTIMO lugar, ou seja, é obrigado a fazer, pelo menos, uma iteração. Assim, ele percorre o segundo ciclo for e vai encontrar mais primos, entretanto, pois está sempre a repetir este processo até n=300... A variável contador, entretanto, ganha mais resultados que 10, e, então, a condição do REPEAT não é mais concretizada.

Eu diria que a tua solução não é nada boa, simplesmente por causa do ciclo for. Estás a obrigar o programa a correr até ao número 300, mesmo depois de ter encontrado os 10 números primos. Um programa deverá consumir o menor número de recursos possível, o menor tempo possível, sem recurso a medidas "à Luis XIV".

O meu programa apenas tem duas ou três falhas, não consome metade dos recursos que tu consomes, e faz parar o programa logo que encontra o 10º número primo, não o obrigando a fazer mais nada.

Aconselho-te a reveres bem essa solução, principalmente se é um trabalho escolar. Os professores odeiam, literalmente, soluções desta natureza.

Dou-te umas pistas para corrigir o meu código, que já o testei:

  • Falta um reinicio da variável contar
  • Falta um else
  • A condição if não está a devolver um resultado booleano.

Cumpz. :)


Knowledge is free!

Share this post


Link to post
Share on other sites
.Tigas.

Bah, eu meti 300 porque posso querer mudar o número do contar de 10 para 20, ou para 30, etc. e excuso de estar a aumentar o limite dos números a verificar (neste caso meti 300).

Estranho o teu CPU consumir assim tantos recursos, eu corro o programa sem problemas. Anyway, também era só um TPC, já não me interessa muito. x)

Share this post


Link to post
Share on other sites
thoga31

Bah, eu meti 300 porque posso querer mudar o número do contar de 10 para 20, ou para 30, etc. e excuso de estar a aumentar o limite dos números a verificar (neste caso meti 300).

Estranho o teu CPU consumir assim tantos recursos, eu corro o programa sem problemas. Anyway, também era só um TPC, já não me interessa muito. x)

Continua a não ser necessário o ciclo for até 300. Se necessitares de centenas de números primos, esse ciclo terá de aumentar também, assim como a tua variável Contar. Se quiseres ter 20 nºs primos, terás sempre de alterar qualquer coisinha.

program primos_prog;
uses crt;
var primos : integer;  // conta nº de primos descobertos até agora
    x, i : integer;
    contar : integer;  // conta quantas vezes (i MOD x) = 0, para cada i.

begin
i:=2;
primos:=0;
write('Primos: ');
while (primos<10) do begin  // Alterar AQUI o nº de primos pretendido. Neste caso, são 10.
      for x:=1 to i do begin
          if (i MOD x = 0) then contar+=1;
      end;
      if (contar=2) then begin
         contar:=0;
         primos+=1;
         write(i,' ');
      end else contar:=0;
      i+=1;
end;
writeln;
writeln('ENTER para sair. . .');
readln;
end.

Eis uma solução baseada na tua mas que é muito melhor. No teu programa, o for não passa de um "pastel" que só dificulta a sua leitura e obriga o PC a pensar mais do que o que deve.


Knowledge is free!

Share this post


Link to post
Share on other sites
joao_o grande

Ola,

Eu fiz um programa ainda melhor!!

Inserem um numero à escolha e o programa indica se é primo ou não!!

Já testei em meia duzia de valores de 0 a 100 e dão todos certos!

Aqui vai:

Program Num_Primo ;
var num,i:longint;
DIVISORES:Byte;

Begin
DIVISORES:=0;

Writeln ('Programa dos números primos - Desenvolvido por: joao_o grande!');
Writeln ('Insira um número inteiro positivo');
Readln (num);
Writeln;

for i:=1 to num do 
Begin
 If (num mod i=0) then
  DIVISORES:=DIVISORES+1;
End;  

If (DIVISORES=2) then
   Writeln ('O número ',num,' é um número primo')
else
   Writeln ('O número ',num,' não é um número primo');
Readln;    
End.

Share this post


Link to post
Share on other sites
thoga31
program primes;

function isPrime(n : longword) : boolean;
var i : longword;
begin
  isPrime := true;
  for i:=2 to trunc(sqrt(n)) do
     if (n mod i = 0) then begin
        isPrime := false;
        break;
     end;
end;

var
  x : longword;

begin
  repeat
     readln(x);
     if not isPrime(x) then
        write('nao ');
     writeln('primo');
  until (x = 0);
end.

Edited by thoga31

Knowledge is free!

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

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