Crivo de Eratóstenes Simples em Pascal
Publicado por Perfil removido (última atualização em 02/05/2012)
[ Hits: 5.483 ]
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.
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.
programa que te ajuda em matematica
Método de eliminação de Gauss com pivotamento parcial
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Atualizando o Fedora 42 para 43
Como saber se o seu e-mail já teve a senha vazada?
Como descobrir se a sua senha já foi vazada na internet?
E aí? O Warsaw já está funcionando no Debian 13? (12)
copiar library para diretorio /usr/share/..... su com Falha na a... (1)
Problema em SSD ao dar boot LinuxMint LMDE FAYE 64 (3)









