Programmiertips
Vorherige Seite
Zurück zur Übersicht
Nächste Seite


Visual Basic & Access (VBA): Primzahlen, Primfaktoren & Co.

Wie bekomme ich heraus, ob eine bestimmte Zahl eine Primzahl ist oder aus welchen Primfaktoren sie zusammengesetzt ist?

Lösung:


Sub Primfaktoren(inData As Long, outData() As Long)

    '################################################################

    '# Erwartet einen Long-Wert in inData und gibt ein Long-Array   #

    '# outData() zurück, das die in Faktoren zerlegte Zahl enthält. #

    '# die zurückgegebenen Faktoren sind aufsteigend sortiert.      #

    '################################################################

    Dim Res As Long

    Dim Div As Long ' Divisor

    '

    ' Zunächst einmal nehmen wir an, daß inData eine Primzahl ist, also

    ' keine weiteren ganzzahligen Faktoren enthält.

    '

    ' Größe des Arrays: 0 To 0

    '

    ReDim outData(0)

    '

    ' Das "letzte Element", daß hier gleich dem ersten ist, erhält inData.

    '

    outData(0) = inData

    If outData(0) < 4 Then ' 1, 2 und 3 sind Primzahlen

        Exit Sub

    End If

    '

    ' Alle vielfachen Teiler von 2 abtrennen

    '

    Res = outData(0) Mod 2

    Do While Res = 0 And outData(UBound(outData)) >= 4

        ' Array um ein Element vergrößern

        ReDim Preserve outData(UBound(outData) + 1)

        ' Das letzte Feld erhält den noch zu unterschenden Rest

        outData(UBound(outData)) = outData(UBound(outData) - 1) / 2

        ' Das vorletzte erhält den Faktor 2

        outData(UBound(outData) - 1) = 2

        Res = outData(UBound(outData)) Mod 2

    Loop

    '

    ' Da wir alle vielfachen von 2 soeben entfernt haben wissen wir nun,

    ' daß die verbleibende Zahl ungerade, also nicht mehr durch 2 teilbar ist.

    ' Wir untersuchen nur noch ungerade Teiler (3, 5, 7 ...), laufen also in

    ' Zweierschritten und damit doppelt so schnell.

    '

    ' Wenn wir uns von unten nähern, sind wir fertig, sobald das Quadrat des aktuellen

    ' Teilers größer ist als die verbleibende Zahl.

    '

    ' Startwert für Divisor: 3

    '

    Div = 3

    Do While outData(UBound(outData)) >= Div * Div

        Res = outData(UBound(outData)) Mod Div

        Do While Res = 0 And outData(UBound(outData)) >= Div * Div

            ' Array um ein Element vergrößern

            ReDim Preserve outData(UBound(outData) + 1)

            ' Das letzte Feld erhält den noch zu unterschenden Rest

            outData(UBound(outData)) = outData(UBound(outData) - 1) / Div

            ' Das vorletzte erhält den aktuellen Divisor

            outData(UBound(outData) - 1) = Div

            Res = outData(UBound(outData)) Mod Div

        Loop

        Div = Div + 2

    Loop

End Sub

Hier ein Beispiel für den Funktionsaufruf:
Public Sub TestePrimzahl()

    Dim TestZahl As Long

    Dim Ergebnis() As Long

    Dim i As Integer



    TestZahl = 97454921 ' (ist Primzahl)

'    TestZahl = 97454929 ' =  11 * 13 * 37 * 113 * 163



    Call Primfaktoren(TestZahl, Ergebnis)

    If LBound(Ergebnis) = UBound(Ergebnis) Then

        ' Das zurückgegebene Feld enthält nur ein Element

        Debug.Print "Primzahl: "; Ergebnis(LBound(Ergebnis))

    Else

        ' Primfaktoren ausgeben

        Debug.Print TestZahl; " = "; Ergebnis(LBound(Ergebnis));

        For i = LBound(Ergebnis) + 1 To UBound(Ergebnis)

            Debug.Print "*"; Ergebnis(i);

        Next

        Debug.Print

    End If

End Sub


Vorherige Seite
Zurück zur Übersicht
Nächste Seite

© 1999 T. Prötzsch
Erstellt am 01. Mai 1999