Javakurs 2007/Primzahlen/Lösungsvorschlag
Für die Teilnehmer gilt: Die Aufgabe bitte zuerst vollständig lösen und mit einem Tutor vergleichen und erst dann diesen Lösungsvorschlag betrachten.
Einfacher Primzahlenfinder
class PrimeNumbersA{
public static void main(String[] args){
int n = 1000; //Wir suchen alle Primzahlen zwischen 1 und n
//die Zahlen 2 bis n durchlaufen und sie auf Primzahlen überprüfen (1 lassen wir weg da Sie per definition keine Primzahl ist)
for(int toCheck = 2; toCheck <= n; toCheck++){
boolean dividerFound = false; //Hier speichern wir uns ob wir für die aktuelle Zahl (toCheck) einen Teiler gefunden haben
for(int z = 2; z < toCheck; z++){ //alle Zahlen kleiner als toCheck überprüfen
if( toCheck % z == 0 ){ //Falls der Rest 0 ist haben wir einen Teiler von toCheck gefunden...
dividerFound = true; //...damit haben wir einen Teiler gefunden und...
break; //...wir können die Schleife verlassen.
}
}
if(!dividerFound) //Falls wir keinen Teiler gefunden haben ist toCheck eine Primzahl
System.out.println(toCheck); //Primzahl ausgeben
}
}
}
Optimierter Primzahlenfinder
class PrimeNumbersB{
public static void main(String[] args){
int n = 100000; //Wir suchen alle Primzahlen zwischen 1 und n
//Wie viele Primzahlen werden wir zwischen 1 und n maximal finden? Wie gross muss unser Array maximal sein?
//Werte durch die optionale Aufgabe ermittelt
int maxPrimes;
if(n <= 13)
maxPrimes = n;
else if(n <= 47)
maxPrimes = n / 2;
else if(n <= 139)
maxPrimes = n / 3;
else if(n <= 389)
maxPrimes = n / 4;
else if(n <= 1139)
maxPrimes = n / 5;
else if(n <= 3121)
maxPrimes = n / 6;
else if(n <= 8479)
maxPrimes = n / 7;
else
maxPrimes = n / 8;
int[] primes = new int[maxPrimes]; //Hier speichern wir uns alle bisher gefundenen Primzahlen
int numPrimes = 0; //Hier speichern wir uns wie viele Primzahlen wir bisher gefunden haben
//die Zahlen 2 bis n durchlaufen und sie auf Primzahlen überprüfen (1 lassen wir weg da Sie per definition keine Primzahl ist)
for(int toCheck = 2; toCheck <= n; toCheck++){
boolean dividerFound = false; //Hier speichern wir uns ob wir für die aktuelle Zahl (toCheck) einen Teiler gefunden haben
for(int z = 0; z < numPrimes; z++){ //alle bisher gefunden Primzahlen durchlaufen und überprüfen ob sie Teiler von toCheck sind
if(primes[z] > toCheck / 2) //falls die Primzahl grösser als die hälfte von toCheck ist kann sie kein Teiler mehr sein und wir sind fertig
break;
if( toCheck % primes[z] == 0 ){ //Falls der Rest 0 ist haben wir einen Teiler von toCheck gefunden...
dividerFound = true; //...damit haben wir einen Teiler gefunden und...
break; //...wir können die Schleife verlassen.
}
}
if(!dividerFound){ //Falls wir keinen Teiler gefunden haben ist toCheck eine Primzahl
System.out.println(toCheck); //Primzahl ausgeben
primes[numPrimes] = toCheck; //Primzahl zu den schon gefunden Primzahlen hinzufügen
numPrimes = numPrimes + 1; //Anzahl der gefundenen Primzahlen erhöhen
}
}
}
}
Optimierter Primzahlenfinder - optionale Aufgabe
class PrimeNumbersBOptional{
public static void main(String[] args){
int n = 10000; //Wir suchen alle Primzahlen zwischen 1 und n
int numPrimes = 0; //Hier speichern wir uns wie viele Primzahlen wir bisher gefunden haben
//die Zahlen 2 bis n durchlaufen und sie auf Primzahlen überprüfen (1 lassen wir weg da Sie per definition keine Primzahl ist)
for(int toCheck = 2; toCheck <= n; toCheck++){
boolean dividerFound = false; //Hier speichern wir uns ob wir für die aktuelle Zahl (toCheck) einen Teiler gefunden haben
for(int z = 2; z < toCheck / 2; z++){ //alle Zahlen kleiner als die hälfte von toCheck überprüfen
if( toCheck % z == 0 ){ //Falls der Rest 0 ist haben wir einen Teiler von toCheck gefunden...
dividerFound = true; //...damit haben wir einen Teiler gefunden und...
break; //...wir können die Schleife verlassen.
}
}
if(!dividerFound) //Falls wir keinen Teiler gefunden haben ist toCheck eine Primzahl
numPrimes = numPrimes + 1; //Anzahl der gefundenen Primzahlen erhöhen
System.out.println("Verhältniss " + toCheck + " zu " + numPrimes + ": " + toCheck/numPrimes); //Verhältniss von überprüften Zahlen zu gefundenen Primzahlen ausgeben
}
}
}