Crivo de Eratóstenes em Pascal
3 participantes
Página 1 de 1
Crivo de Eratóstenes em Pascal
Olá, pessoal. Encontrei na Internet uma implementação do Crivo de Eratóstenes em Pascal. Fiz algumas alterações que, na minha opinião, tornavam melhor a compreensão e execução do código-fonte, e estou disponibilizando agora aqui para vocês:
Só tem um problema com ele: ele só calcula números primos até 255, isso porque em uma das variáveis é do tipo conjunto de bytes (set of Byte), como vocês podem ver lá em cima. Eu tentei mudar o tipo para set of Integer, mas o compilador acusou erro, então deixei como estava. De certa forma, um dado do tipo conjunto (set) é novidade pra mim. Como é algo que desconheço, decidi deixar como estava.
Exceto por esse problema, esse código é excelente, e a série de comandos reproduz exatamente o que o professor mostrou sobre o Crivo de Eratóstenes.
Fica aberto o espaço para sugestões de melhorias nessa implementação ou outras implementações. Um abraço a todos.
- Código:
program CrivoDeEratostenes;
{Calcula os números primos de 2 até N recorrendo ao Crivo de Eratóstenes
Modificado e comentado por Antônio Vinícius
Baseado em: http://wiki.portugal-a-programar.org/algoritmo:crivo_de_eratosthenes}
uses
Crt;
var
Limite: Integer; //Limite para cálculo do Crivo, que deve ser o número fornecido pelo usuário
Numeros: set of Byte; //Conjunto dos números naturais de 2 até o limite
Numero: Integer; //Número natural que será analisado, sendo excluído se for múltiplo de um primo
Primos: set of Byte; //Conjunto dos números primos, que será obtido pelo Crivo
Primo: Integer; //Número primo que excluirá seus múltiplos do Crivo
MenorValor: Integer; //Variável auxiliar para determinar, após a exclusão dos múltiplos de um primo, qual o próximo primo a ser utilizado
begin
write('Calcular numeros primos ate: ');
readln(Limite); //Obtém o limite para o cálculo do Crivo
Numeros:= [2..Limite]; //Define o conjunto dos números naturais de 2 até o limite do Crivo. Os fatores do número, se este não for primo, devem pertencer a este conjunto
Primos:= []; //Define o conjunto dos números primos de 2 até o limite do Crivo. Ainda não foi calculado nenhum número primo, portanto este conjunto é vazio
Primo:= 2; //Define o primeiro primo que será utilizado, que é 2
while ([Primo] <= Numeros) do //Percorre o conjunto dos números naturais
begin
Primos:= Primos + [Primo]; //Acrescenta o primo da vez ao conjunto dos primos
for Numero:= Primo to Limite do
begin
if (Numero mod Primo = 0) then Numeros:= Numeros - [Numero]; //Elimina do conjunto dos números naturais os múltiplos desse primo (inclusive ele próprio)
end;
MenorValor:= 2; //Determinação do próximo primo a ser utilizado, que é o menor valor dos restantes no conjunto dos números naturais
while (not ([MenorValor] <= Numeros)) and (MenorValor <= Limite) do Inc(MenorValor);
Primo:= MenorValor;
end;
write('Primos: '); // Mostra os números primos calculados
for Primo:= 2 to Limite do
begin
if ([Primo] <= Primos) then write(Primo, ', ');
end;
writeln;
write('Pressione qualquer tecla para sair...');
readkey; //Pausa antes de encerrar para que o resultado possa ser lido na tela
end.
Só tem um problema com ele: ele só calcula números primos até 255, isso porque em uma das variáveis é do tipo conjunto de bytes (set of Byte), como vocês podem ver lá em cima. Eu tentei mudar o tipo para set of Integer, mas o compilador acusou erro, então deixei como estava. De certa forma, um dado do tipo conjunto (set) é novidade pra mim. Como é algo que desconheço, decidi deixar como estava.
Exceto por esse problema, esse código é excelente, e a série de comandos reproduz exatamente o que o professor mostrou sobre o Crivo de Eratóstenes.
Fica aberto o espaço para sugestões de melhorias nessa implementação ou outras implementações. Um abraço a todos.
vinyanalista- Estudante Aplicado
- Mensagens : 26
Data de inscrição : 04/04/2011
Re: Crivo de Eratóstenes em Pascal
Cara, muito bom o código, só é chato mesmo a limitação dele... Mas já é algo que vai ajudar os estudos.
Muito obrigado por sua iniciativa e pelo código!
Muito obrigado por sua iniciativa e pelo código!
Re: Crivo de Eratóstenes em Pascal
interessante esse script.
obrigado por trazer conteúdo útil ao fórum!
Att,
Kiko Garcia//
obrigado por trazer conteúdo útil ao fórum!
Att,
Kiko Garcia//
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos
|
|