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
Free Pascal Compiler version 2.6.4+dfsg-6 [2015/05/31] for i386
Copyright (c) 1993-2014 by Florian Klaempfl and others
Target OS: Linux for i386
Compiling prog.pas
prog.pas(1,21) Error: Identifier not found "TPrimeTime"
prog.pas(1,42) Error: class identifier expected
prog.pas(3,22) Error: Identifier not found "TList"
prog.pas(3,22) Error: Error in type definition
prog.pas(13,12) Error: Identifier not found "Result"
prog.pas(17,24) Error: Identifier not found "TList"
prog.pas(17,32) Error: Illegal expression
prog.pas(17,33) Fatal: Syntax error, ")" expected but ";" found
Fatal: Compilation aborted
Error: /usr/bin/ppc386 returned an error exitcode (normal if you did not specify a source file to be compiled)
stdout
Standard output is empty