|
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
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
|
© 1999 T. Prötzsch |
Erstellt am 01. Mai 1999
|