VBA Excel - Números primos

Janeiro 2017



Introdução

Para encontrar todos os números primos, vamos usar o método do Crivo de Eratóstenes. Trata-se de fazer um loop através de todos os números de a n, para verificar se o número "em curso" é um múltiplo. Se não for, então é um número primo.
Link do wikipédia.

Algoritmo

Para fazê-lo, vamos escrever a lista de todos os números até o Número Máximo.
  • Eliminamos 1.
  • Sublinhamos 2 on eliminamos todos os múltiplos de 2.
  • Idem com o 3.
  • Em seguida, escolhemos o menor número não sublinhado ou não eliminado, aqui o 5,
  • Eliminamos todos os seus múltiplos.
  • O método é repetido até a parte inteira da raiz do n.

Os números não eliminados são os números primos até n.

O código da função

A escolha do tipo desta função se deve ao fato de que eu quero ver os erros aparecerem como uma mensagem para o usuário. Poderíamos facilmente "ajustar" para que esta função nos retorne um número do tipo Integer (inteiro) ou Long (longo)...
Por razões de lentidão deste código, nós também vamos nos restringir aos primeiros 1500 números primos...

Function NumerosPrimos_Eratóstenes(Rang As Long) As Variant
'Determinação do enésimo número primo método do crivo de Eratóstenes
Dim i As Long, j As Long, k As Long, NumMax As Long, é_primo(), Flag As Boolean

If Rang >= 1 And Rang <= 1500 Then
    ReDim Preserve é_primo(Rang)
    k = 0
    NumMax = 20 * Rang basta para um rang< 1500
    Flag = True
    For i = 2 To NumMax
        For j = 2 To i
            If j = i Then Exit For
            If i Mod j = 0 Then Flag = False: Exit For
        Next
        If Flag = True Then
            If i = 2 Then
                é_primo(k) = 1
                k = k + 1
            Else
                é_primo(k) = i
                k = k + 1
            End If
        Else
            Flag = True
        End If
        If k = Rang Then Exit For
    Next i
    NumPrimos_Eratóstenes = é_primo(Rang - 1)
Else
    NumPrimos_Eratóstenes = "Rang muito grande ou muito pequeno (entre 1 e 1500 inclusive)."
End If
End Function

Código de chamada

Temos duas possibilidades:

Enésimo número primo

Sub Test()
'Para obtermos o 499° Número primo:
  MsgBox NumPrimos_Eratóstenes(499)
End Sub

Lista dos 99 primeiros números primos

Sub ListaNumPrimos()
'Para obtermos a lista dos 99 primeiros números primos:
Dim i As Long, Msg As String, Tb(98)

For i = 1 To 99
    Tb(i - 1) = NumPrimos_Eratóstenes(i)
Next i
MsgBox Tb(0) & " " & Tb(1) & " " & Tb(2) & " ... " & Tb(UBound(Tb))
End Sub

Arquivo para baixar

Uma pasta exemplo está disponível aqui: Arquivo no formato .xls (em francês)

Tradução feita por Lucia Maurity y Nouira

Veja também

Artigo original publicado por . Tradução feita por pintuda. Última modificação: 7 de agosto de 2014 às 07:53 por pintuda.
Este documento, intitulado 'VBA Excel - Números primos', está disponível sob a licença Creative Commons. Você pode copiar e/ou modificar o conteúdo desta página com base nas condições estipuladas pela licença. Não se esqueça de creditar o CCM (br.ccm.net) ao utilizar este artigo.