Crivo de Eratóstenes Simples em Pascal
Publicado por Perfil removido (última atualização em 02/05/2012)
[ Hits: 5.232 ]
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.
Método de eliminação de Gauss com pivotamento parcial
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Meu Fork do Plugin de Integração do CVS para o KDevelop
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Compartilhamento de Rede com samba em modo Público/Anônimo de forma simples, rápido e fácil
Cups: Mapear/listar todas as impressoras de outro Servidor CUPS de forma rápida e fácil
Criando uma VPC na AWS via CLI
Tem como instalar o gerenciador AMD Adrenalin no Ubuntu 24.04? (15)
Tenho dois Link's ( IP VÁLIDOS ), estou tentando fazer o failover... (0)
Pendrive não formata de jeito nenhum (4)