fork download
  1. function TPrimeTime.NumberOfSmallerPrimes(MaximusPrime: Integer): Integer;
  2. var
  3. listOfPrimes: TList; // Liste aller gefundenen Primzahlen
  4. currentNumber: Integer; // Zahl, die wir gerade auf Prim-Eigenschaften prüfen
  5. currentPrimeNumber: Integer; // Primzahl, die wir gerade als Faktor ausschließen wollen
  6. currentPrimeNumberIndex: Integer; // Stelle der Primzahl in der Liste
  7. mightBeAPrime: Boolean; // true, solange wir nciht sicher wissen, dass die Zahl keine Primzahl ist
  8. isAPrime: Boolean; // true, wenn wir sicher wissen, dass die Zahl eine Primzahl ist. Wird nur zum früheren Verlassen der While-Schleife verwendet
  9. primeCounter: Integer; // zählt die Anzahl der gefundenen Primzahlen
  10. maxPossiblePrimeFactor: Real; // kein Primfaktor kann größer sein als diese Zahl
  11. begin
  12. if MaximusPrime <= 0 then begin // ungültige Eingabe
  13. Result := -1;
  14. Exit; // Abbruch
  15. end;
  16.  
  17. listOfPrimes := TList.Create(); // Liste anlegen
  18. primeCounter := 0; // Bisher haben wir keine Primzahlen gefunden.
  19.  
  20. for currentNumber := 2 to MaximusPrime - 1 do begin // Wir schauen uns nacheinander alle potentiellen Primzahlen an, die kleiner als MaximusPrime sind
  21. mightBeAPrime := true; // Bleibt true, solange wir nicht beweisen können, dass currentNumber keine Primzahl ist.
  22. isAPrime := false; // Bisher haben wir noch keinen Beweis, dass es sich um eine Primzahl handelt.
  23. currentPrimeNumberIndex := 0; // Wir durchlaufen die Liste der bekannten Primzahlen von Anfang an
  24. maxPossiblePrimeFactor := Sqrt(currentNumber); // Zahlen größer als die Quadratwurzel von currentNumber können keine Primfaktoren sein.
  25.  
  26. while (currentPrimeNumberIndex < listOfPrimes.Count) and mightBeAPrime and (not isAPrime) do begin // Wir suchen nach einer Primzahl, durch die sich currentNumber teilen lässt.
  27. if (Integer(listOfPrimes.Items[currentPrimeNumberIndex]) > maxPossiblePrimeFactor) then begin // Wir werden keine größeren Primfaktoren mehr finden
  28. isAPrime := true; // die Zahl ist ganz sicher eine Primzahl. Wir verlassen die Schleife frühzeitig, wobei mightBeAPrime noch true ist.
  29. end else if (currentNumber mod Integer(listOfPrimes.Items[currentPrimeNumberIndex])) = 0 then begin
  30. mightBeAPrime := false; // currentNumber ist durch eine Primzahl teilbar, also kann sie selber keine Primzahl sein. Wir können den Test abbrechen.
  31. end;
  32. currentPrimeNumberIndex := currentPrimeNumberIndex + 1; // Mit der nächsten Primzahl weitermachen.
  33. end;
  34.  
  35. if mightBeAPrime then begin // Wir konnten nicht beweisen, dass es keine Primzahl ist -> Im Zweifel für den Angeklagten.
  36. listOfPrimes.Add(Pointer(currentNumber)); // Die geprüfte Zahl zur Liste der bekannten Primzahlen hinzufügen
  37. primeCounter := primeCounter + 1; // Anzahl der gefundenen Primzahlen erhöhen
  38. end;
  39. end;
  40.  
  41. listOfPrimes.Free(); // Aufräumen
  42.  
  43. Result := primeCounter; // Das Ergebnis ist die Anzahl der gefundenen Primzahlen
  44. end;
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
prog.pas:0: warning: missing program header
prog.pas:1: error: object type name expected, `TPrimeTime' given
prog.pas:1: error: no such method in object
prog.pas: In method `NumberOfSmallerPrimes':
prog.pas:3: error: unknown identifier `TList'
prog.pas:13: error: undeclared identifier `Result' (first use in this routine)
prog.pas:13: error:  (Each undeclared identifier is reported only once
prog.pas:13: error:  for each routine it appears in.)
prog.pas:17: error: undeclared identifier `listOfPrimes' (first use in this routine)
prog.pas:17: error: undeclared identifier `TList' (first use in this routine)
prog.pas:44: error: result of function `NumberOfSmallerPrimes' not assigned
prog.pas: At top level:
prog.pas:45: error: syntax error at end of input
stdout
Standard output is empty