Crivo de Eratóstenes Simples em Pascal

Publicado por Perfil removido (última atualização em 02/05/2012)

[ Hits: 5.213 ]

Download sieve001.pas




Esta implementação do Crivo de Erastótenes possui diretivas de pré-compilação que permitem que o código seja compilado por fpc (Free Pascal) ou gpc (GNU Pascal).

Na prática é igual a um IF ... THEN ... sem usar BEGIN ... END e usando ENDIF. Sendo também que esta etapa ocorre como uma filtragem de código, antes deste ser compilado.

No caso os compiladores consideram na compilação o código dentro de {$ifdef X} ... {$endif} somente se houver uma identificação de um símbolo (aqui chamado de X) no contexto

Já {$ifndef X} ... {$endif} faz o contrário: compila se a definição do símbolo não for encontrada.

A pré-definição "FPC" indica uso do compilador Free Pascal.

A pré-definição  __GPC_RELEASE__  indica uso do compilador GNU PASCAL.

O código demarcado, portanto, só será usado conforme estes símbolos aparecerem {ifdef ...} ou não {ifndef ...}, isto é, conforme os compiladores utilizados.

O nome dos tipos de dados numéricos para valores grandes é diferente nos dois compiladores e foi utilizada uma predefinição na área TYPE do código.

Dentro desta área o código é selecionado em tempo de compilação conforme a diretiva.

Mais abaixo também está outro par de compilações condicionais.

A procedure Inc (...) parece não funcionar com valores não-ordinais ou inteiros no Free Pascal, portanto foi escolhido o incremento na forma-padrão como opção.

Acredito que o uso de Inc (...) funcione do mesmo modo que a variável com "duplo mais" (V++) ou "mais igual" (V+=2) funcionam otimizados em C.

  



Esconder código-fonte

Program sieve001;

{$ifndef __GPC_RELEASE__} Uses Crt; {$endif} 

Type

{$ifdef FPC}
   MyInt = QWord;
   MyReal = Extended;
{$endif}

{$ifdef __GPC_RELEASE__}
   MyInt = LongestWord;
   MyReal = LongestReal;
{$endif}

Const

{
   A titulo de curiosidade para valores grandes
   
   X = MyInt (18446744073709551615); 
   T = MyInt (500000);
   S = MyInt (279800); 
}

   T = MyInt (500000);
   S = MyInt (41550); 


Var
   primes            : Array [1..S] of MyInt;
   i, j, l, m, p, q      : MyInt;
   k, n            : MyReal;

Begin

   primes[1] := 2;
   primes[2] := 3;
 
   j:=0; l:=3; m:=l;
   k:=0.0; n := 5.0; 
   p := T; q := S;

   While m<=q Do Begin 
      primes[m] := 1;
      Inc(m);
   End;
 
   Repeat
 
      i := Trunc(n); 
      j := 1;
      k := SQRT(n);
 
      While (primes[j]<k) And ((i Mod primes[j])<>0) Do Inc(j);
 
      If (primes[j]>k) Then Begin 
         primes[l] := i;
         Inc (l);
      End;

{$ifdef FPC}
      If ((i Mod 3)=2) Then n:=n+2
      Else n:=n+4;
{$endif}

{$ifdef __GPC_RELEASE__}
      If ((i Mod 3)=2) Then Inc(n,2.0)
      Else Inc(n,4.0);
{$endif}
 
   Until (n>=p);

   m := 1;

   While m<l Do Begin 
      Write (primes[m], ' ');
      Inc(m);
   End;

   WriteLn;

End.

Scripts recomendados

Método de eliminação de Gauss com pivotamento parcial

Forca

Calculadora

Data e Hora em pascal

Sistemas númericos


  

Comentários


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts