Wieso werden nicht alle Primzahlen bis 1000 in meine Liste gepackt ?

sserio

Bekanntes Mitglied
package ProjectEuler3;

import java.util.List;
import java.util.ArrayList;

public class Main {

public static void main(String[] args) {
findPrimeNumbers(1000);

}

public static void findPrimeNumbers(int number) {
List<Integer> list = new ArrayList<>();
int counter = 0;
if (number < 2) {
throw new IllegalArgumentException(" 1 and 2 aren't prime numbers");
}
for (int i = 2; i < number; i++) {
for (int j = 2; j < 10; j++) {
if (i % j == 0) {
counter++;
}
}
if (counter == 1) {
list.add(i);
counter = 0;
}
}
System.out.println(list);
}
}
Zurzeit sind bei mir nur die Zahlen 2 und 3 in der Liste.
 

sserio

Bekanntes Mitglied
Zurzeit sind bei mir nur die Zahlen 2 und 3 in der Liste.
nochmal eine Korrektur ich habe es jetzt hinbekommen, weiß aber nicht ob das so wirklich schnell und effektiv ist. Verbesserungsvorschläge nehme ich gerne an
import java.util.List;
import java.util.ArrayList;

public class Main {

public static void main(String[] args) {
findPrimeNumbers();

}

public static void findPrimeNumbers() {
List<Integer> list = new ArrayList<>();
int counter = 0;
int zaehler = 0;
for (int i = 2; i < 1000; i++) {
for (int j = 2; j < 1000; j++) {
if (isTrue(i, j)) {
counter++;
}
}
if (counter == 1) {
counter = 0;
list.add(i);
zaehler++;
} else counter = 0;
}
System.out.println(list);
System.out.println(zaehler);
}

public static boolean isTrue(int n, int m) {
return n % m == 0;
}
}
 
G

Gelöschtes Mitglied 65838

Gast
du kannst es anders angehen...

Java:
list;
list.add(2);
foreach ( number in 1000 )
    foreach( prime in list )
        if( number % prime == 0 )
            => keine Primzahl ist durch prime teilbar
           => kann man eig breaken
          
        if( war durch gar nichts teilbar von der Liste )
            => ist eine Neue Primzahl und list.add(number)
2 ist eine Primzahl übrigens :)

eine Zahl ist dann eine primzahl wenn sie nicht durch primzahlen geteilt werden kann.. du probierst zb 4 aus bei 16 das geht aber 4 ist keine primzahl dh der fall ist schon bei 2 abgedeckt => unnötig deswegen ist deines viel langsamer
 

sserio

Bekanntes Mitglied
du kannst es anders angehen...

Java:
list;
list.add(2);
foreach ( number in 1000 )
    foreach( prime in list )
        if( number % prime == 0 )
            => keine Primzahl ist durch prime teilbar
           => kann man eig breaken
         
        if( war durch gar nichts teilbar von der Liste )
            => ist eine Neue Primzahl und list.add(number)
2 ist eine Primzahl übrigens :)

eine Zahl ist dann eine primzahl wenn sie nicht durch primzahlen geteilt werden kann.. du probierst zb 4 aus bei 16 das geht aber 4 ist keine primzahl dh der fall ist schon bei 2 abgedeckt => unnötig deswegen ist deines viel langsamer
aber ich weiß ja noch garnicht ob meine zahlen primzahlen sind (Zeile 5), soll ich dann immer wieder durch die Liste gehen?
 
G

Gelöschtes Mitglied 65838

Gast
du hast immer die 2 drin

und jetzt machst du bis 10 die zahlen
Java:
3 => 3 % 2 = 1 => list.add(3)
4 => 4 % 2 = 0 => break;
// du musst alle elemente der liste durchlatschen
5 => 5 % 2 = 1 => 5 % 3 = 2 => list.add(5)
6 => 6 % 2 =>
 
G

Gelöschtes Mitglied 65838

Gast
bei "ich hab es gerade geschafft 2 for schleifen zu verschachteln" sollte man vllt mit algorithmen etwas warten @mihe
 

mihe7

Top Contributor
OK, dann lösen wir das ganze halt mal von vorne:

Java:
        for (int i = 2; i < number; i++) {
           for (int j = 2; j < 10; j++) {
Was soll der Käse mit der 10?

Oder hier
Java:
        for (int i = 2; i < 1000; i++) {
           for (int j = 2; j < 1000; j++) {
die 1000?

Bei solchen Dingen empfiehlt es sich, den Kopf einzuschalten:

Die äußere Schleife gibt die Zahl an, die dahingehend überprüft werden soll, ob es sich um eine Primzahl handelt. Wir wissen, dass 2 die kleinste Primzahl ist, also können wir bei 3 anfangen. Wir wissen auch, dass eine Primzahl ungerade ist, also brauchen wir nur ungerade Zahlen zu betrachten.

Die innere Schleife gibt einen möglichen Teiler dieser Zahl an. Die Frage ist, ob eine Zahl i durch eine Zahl j teilbar ist. Dann gäbe es eine Zahl k mit j*k=i. Außerdem muss der Teiler einer ungeraden Zahl selbst ungerade sein, denn nur das Produkt zweier ungerader Zahlen liefert wird eine ungerade Zahl.

Wie groß kann j denn maximal sein? Muss wirklich bis i geprüft werden?

Nein, weil die Multiplikation kommutativ ist. Hätte man z. B. i=1 geprüft, damit wäre automatisch auch i erledigt denn 1*i = i*1 = i. Die größtmögliche Teiler von i kann nicht größer als die Quadratwurzel von i sein, d. h. j <= sqrt(i) oder andersrum j*j <= i

Damit ergibt sich nun:
Java:
System.out.println("2 ist Primzahl");
for (int zahl = 3; zahl < 1000; zahl += 2) {
    boolean istPrimzahl = true;
    int maxTeiler = (int) Math.sqrt(zahl);
    for (int teiler = 3; istPrimzahl && teiler <= maxTeiler; teiler += 2) {
        if (zahl % teiler == 0) {
            istPrimzahl = false;
        }
    }
    if (istPrimzahl) {
        System.out.printf("%d ist Primzahl!%n", zahl);
    }
}
Der Algorithmus von @Joreyk geht noch einen Schritt weiter: statt immer alle ungeraden Teiler zu prüfen, prüft er nur die bereits gefundenen Primzahlen, was natürlich noch sehr viel effizienter ist:

Java:
System.out.println("2 ist Primzahl");
int[] primzahlen = new int[1000];
int anzahl = 0; // bereits gefundene Primzahlen (ohne die 2)
for (int zahl = 3; zahl < 1000; zahl += 2) {
    boolean istPrimzahl = true;
    for (int teilerIndex = 0; istPrimzahl && teilerIndex < anzahl; teilerIndex++) {
        if (zahl % primzahlen[teilerIndex] == 0) {
            istPrimzahl = false;
        }
    }
    if (istPrimzahl) {
        System.out.printf("%d ist Primzahl!%n", zahl);
        primzahlen[anzahl] = zahl;
        anzahl++;
    }
}
System.out.printf("%d Primzahlen gefunden\n", anzahl+1);
 

sserio

Bekanntes Mitglied
OK, dann lösen wir das ganze halt mal von vorne:

Java:
        for (int i = 2; i < number; i++) {
           for (int j = 2; j < 10; j++) {
Was soll der Käse mit der 10?

Oder hier
Java:
        for (int i = 2; i < 1000; i++) {
           for (int j = 2; j < 1000; j++) {
die 1000?

Bei solchen Dingen empfiehlt es sich, den Kopf einzuschalten:

Die äußere Schleife gibt die Zahl an, die dahingehend überprüft werden soll, ob es sich um eine Primzahl handelt. Wir wissen, dass 2 die kleinste Primzahl ist, also können wir bei 3 anfangen. Wir wissen auch, dass eine Primzahl ungerade ist, also brauchen wir nur ungerade Zahlen zu betrachten.

Die innere Schleife gibt einen möglichen Teiler dieser Zahl an. Die Frage ist, ob eine Zahl i durch eine Zahl j teilbar ist. Dann gäbe es eine Zahl k mit j*k=i. Außerdem muss der Teiler einer ungeraden Zahl selbst ungerade sein, denn nur das Produkt zweier ungerader Zahlen liefert wird eine ungerade Zahl.

Wie groß kann j denn maximal sein? Muss wirklich bis i geprüft werden?

Nein, weil die Multiplikation kommutativ ist. Hätte man z. B. i=1 geprüft, damit wäre automatisch auch i erledigt denn 1*i = i*1 = i. Die größtmögliche Teiler von i kann nicht größer als die Quadratwurzel von i sein, d. h. j <= sqrt(i) oder andersrum j*j <= i

Damit ergibt sich nun:
Java:
System.out.println("2 ist Primzahl");
for (int zahl = 3; zahl < 1000; zahl += 2) {
    boolean istPrimzahl = true;
    int maxTeiler = (int) Math.sqrt(zahl);
    for (int teiler = 3; istPrimzahl && teiler <= maxTeiler; teiler += 2) {
        if (zahl % teiler == 0) {
            istPrimzahl = false;
        }
    }
    if (istPrimzahl) {
        System.out.printf("%d ist Primzahl!%n", zahl);
    }
}
Der Algorithmus von @Joreyk geht noch einen Schritt weiter: statt immer alle ungeraden Teiler zu prüfen, prüft er nur die bereits gefundenen Primzahlen, was natürlich noch sehr viel effizienter ist:

Java:
System.out.println("2 ist Primzahl");
int[] primzahlen = new int[1000];
int anzahl = 0; // bereits gefundene Primzahlen (ohne die 2)
for (int zahl = 3; zahl < 1000; zahl += 2) {
    boolean istPrimzahl = true;
    for (int teilerIndex = 0; istPrimzahl && teilerIndex < anzahl; teilerIndex++) {
        if (zahl % primzahlen[teilerIndex] == 0) {
            istPrimzahl = false;
        }
    }
    if (istPrimzahl) {
        System.out.printf("%d ist Primzahl!%n", zahl);
        primzahlen[anzahl] = zahl;
        anzahl++;
    }
}
System.out.printf("%d Primzahlen gefunden\n", anzahl+1);
Danke für deine Antwort, habe es mittlerweile irgendwie selber geschafft, jedoch mit einem neuen Weg
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Regex Ausdrücke im Array - Wieso werden sie nicht erkannt? Java Basics - Anfänger-Themen 4
G Interface java.util.Comparator: Wieso muss nur die Methode compare() implementiert werden Java Basics - Anfänger-Themen 2
F Wieso werden Char-Werte wie Zahlen addiert? Java Basics - Anfänger-Themen 5
P Wieso kann ich als Index für einen Array einen Char angeben? Java Basics - Anfänger-Themen 3
Ostkreuz Wieso wird die Methode nochmal aufgerufen? Java Basics - Anfänger-Themen 5
H Interface Wieso "List<String> list = new ArrayList<>[…]" Java Basics - Anfänger-Themen 4
I Methoden Wieso wird mein Array "a" verändert und meine Variable "a" nicht? Java Basics - Anfänger-Themen 4
sserio Wieso funktioniert mein Programm nicht Java Basics - Anfänger-Themen 2
sserio Wieso funktioniert mein TableView nicht /JavaFX. Java Basics - Anfänger-Themen 4
N Wieso funktioniert die Deklaration nicht Java Basics - Anfänger-Themen 3
Zrebna Umgebungsvariable Wieso wird meine verwendete JDK-Version in der Prompt nicht erkannt? Java Basics - Anfänger-Themen 6
F Wieso wird immer die falsche Mausposition angegeben? Java Basics - Anfänger-Themen 1
C Objekt1.equals(Objekt2) = immer false. Wieso? Java Basics - Anfänger-Themen 22
A Wieso bekomme ich hier zwei unterschiedliche Ausgaben? Java Basics - Anfänger-Themen 6
J Fehler im Code, aber ich weiß nicht wieso! Java Basics - Anfänger-Themen 6
ZH1896ZH Wieso diese Ausgabe?? Java Basics - Anfänger-Themen 10
W Wieso funktioniert mein Switch Case nicht ?! Java Basics - Anfänger-Themen 9
D Interface Wieso Aufruf aller Methoden eines Interfaces? Java Basics - Anfänger-Themen 11
F Wieso wird dieser Befehl nicht ausgeführt? (Anfänger) Java Basics - Anfänger-Themen 2
H Datentypen 64 Bit passt in 32 Bit, wieso? Java Basics - Anfänger-Themen 9
L Input/Output Wieso kommt diese Ausgabe? Java Basics - Anfänger-Themen 12
H Wieso wird mir ein Fehler angezeigt? Java Basics - Anfänger-Themen 5
H Wieso öffnet sich der Texteditor? Java Basics - Anfänger-Themen 6
ChrisPL4Y Wieso funktioniert dieses Programm nicht? Java Basics - Anfänger-Themen 6
B Wieso wird die Zeile "column" genannt und die Spalte "line"? Java Basics - Anfänger-Themen 12
B Wieso wird hier so viel als falsch angezeigt? Java Basics - Anfänger-Themen 2
B Wieso gibt er hier nur die ungeraden Zahlen aus? Java Basics - Anfänger-Themen 5
B Wieso gibt das Programm in der Console kein Ergebnis aus? Java Basics - Anfänger-Themen 2
A Wieso charAt(0) + charAt(3) = INT-Wert? Java Basics - Anfänger-Themen 5
H NullPointerException, aber wieso? Java Basics - Anfänger-Themen 5
P Cannot find symbol, wieso? Java Basics - Anfänger-Themen 5
K Wieso muss man finale statische Variablen sofort oder eben im Konstruktor initialisieren? Java Basics - Anfänger-Themen 2
F Operatoren Wieso fliegt hier eine NullPointer Exception :( Java Basics - Anfänger-Themen 3
Z JPanel wird zweimal hinterinander gezeichnet.. Wieso? Java Basics - Anfänger-Themen 4
T Wieso kann ich das jar file nicht starten? Java Basics - Anfänger-Themen 5
S Wieso wird mein JFrame transparent dargestellt? Java Basics - Anfänger-Themen 5
A Wieso übergibt der nicht die bearbeitete txt file Java Basics - Anfänger-Themen 8
Z Lotto-Programm Wieso klappt das? Java Basics - Anfänger-Themen 8
P Compiler-Fehler wieso zeigt der compiler ein else without if? Java Basics - Anfänger-Themen 3
S OOP Die Methode funktioniert, aber wieso? Java Basics - Anfänger-Themen 2
X Connection reset, wieso? Java Basics - Anfänger-Themen 4
T Objektorientierte Programmierung - Kein Plan wieso das nicht funktioniert! Java Basics - Anfänger-Themen 6
A Bild verschwindet! Wieso?? Java Basics - Anfänger-Themen 2
A Wieso kann ich nicht auf diese Variable zugreifen? Java Basics - Anfänger-Themen 6
A Wieso funktioniert dieser Timer nicht?? Java Basics - Anfänger-Themen 3
A Wieso denn das??? Java Basics - Anfänger-Themen 2
A Wieso erscheinen die Objekte manchmal und manchmal nicht Java Basics - Anfänger-Themen 2
A Erste Schritte Wieso funktioniert diese Klasse nicht Java Basics - Anfänger-Themen 11
R Wieso funktioniert dieses Array nicht? Java Basics - Anfänger-Themen 13
S Methoden void-Methode: Wieso gibt es eine Rückgabe? Java Basics - Anfänger-Themen 5
X Stack mit Oberklasse, wieso funktioniert es nicht? Java Basics - Anfänger-Themen 8
SexyPenny90 Wieso ist diese eigene Equals-Methode schlecht? Java Basics - Anfänger-Themen 17
C Klassen Wieso kein infiniter Regress? Java Basics - Anfänger-Themen 4
M ArrayList - remove() löscht nicht! - weiß nicht wieso! Java Basics - Anfänger-Themen 8
X Wieso mehrere JRE ordner? Java Basics - Anfänger-Themen 8
A Wieso wird immer 0 ausgegeben? Java Basics - Anfänger-Themen 4
R Wieso hat ein Konstruktor keinen Rückgabetyp? Java Basics - Anfänger-Themen 6
T JTable wird nicht erzeugt, wieso? Java Basics - Anfänger-Themen 17
S JTable removeRow() IndexOutOfBounceException - wieso? Java Basics - Anfänger-Themen 3
S wieso Fehlermeldung cannot find symbol hier Java Basics - Anfänger-Themen 10
N NumberFormatException, aber wieso? Java Basics - Anfänger-Themen 5
E Wieso funktioniert Boolean.parseBoolean(s) nicht? Java Basics - Anfänger-Themen 9
T Wieso kompiliert das? Java Basics - Anfänger-Themen 7
B Erste Schritte Programm kompiliert nicht. Wieso? Java Basics - Anfänger-Themen 14
Luk10 Wieso bricht die Rekursion nicht ab? Java Basics - Anfänger-Themen 3
B Warnung : Dead Code. Aber wieso? Java Basics - Anfänger-Themen 10
W Compiler-Fehler NullPointerException. Aber wieso? Java Basics - Anfänger-Themen 2
C Conways Game of Life / "Waldbrandsimulation": wieso temporäres Hilfs-Array?! Java Basics - Anfänger-Themen 8
R If-Abfrage liefert false zurück, wieso ? Java Basics - Anfänger-Themen 20
K Methode funzt nicht, wieso? Java Basics - Anfänger-Themen 12
H Wieso ist das eine Endlosschleife? Java Basics - Anfänger-Themen 8
R wieso Nullpoint und was mit Events ? Java Basics - Anfänger-Themen 14
C Wieso funktioniert das Array nicht? Java Basics - Anfänger-Themen 10
R Wieso hänge ich hier in einer Endlosschleife (vermute ich zumindest)? Java Basics - Anfänger-Themen 2
M Wieso funktioniert dieser simple Code nicht? Java Basics - Anfänger-Themen 9
J Wert wird überschrieben, weiß nicht wieso Java Basics - Anfänger-Themen 2
S wieso ist mein Code falsch? Java Basics - Anfänger-Themen 2
D array.toString() wieso funktioniert es nicht Java Basics - Anfänger-Themen 4
A Wieso terminiert das Programm nicht? Java Basics - Anfänger-Themen 4
B Wieso ein Fehler? illegal Starts of expression? Java Basics - Anfänger-Themen 12
radiac Wieso bekomme ich kein Bild drauf??? Java Basics - Anfänger-Themen 13
Hatebreed Keine Datenbankverbindung, wieso? (ClassNotFoundEscpetion) Java Basics - Anfänger-Themen 18
U Anfänger Frage - Ausgabe funktioniert nicht - Wieso? Java Basics - Anfänger-Themen 10
G Wieso enum Declaration nur außerhalb einer Methode möglich? Java Basics - Anfänger-Themen 9
S Wieso funtkioniert das SQL DELETE nicht? Java Basics - Anfänger-Themen 1
K Wieso schaltet meine CheckBox von selbst um ? Java Basics - Anfänger-Themen 31
fill0soph Wieso ist "Minus-Unendlich" == 1? Java Basics - Anfänger-Themen 4
G Wieso werdne die componentne nciht angezeigt Java Basics - Anfänger-Themen 4
B Primzahlen berechnen - Wieso unterschiedliche Java Basics - Anfänger-Themen 3
K Wieso wird "paint" nicht ausgeführt ? Java Basics - Anfänger-Themen 2
F Wieso java.lang.StackOverflowError (minimales programm) Java Basics - Anfänger-Themen 11
G Wieso eine nullpointerexception? Java Basics - Anfänger-Themen 6
G Wieso ist eine String-Übergabe keine by-reference-Zuweisung? Java Basics - Anfänger-Themen 7
K Wieso kommt ne NullPointerException Java Basics - Anfänger-Themen 3
N Wieso final ? Java Basics - Anfänger-Themen 4
H wieso syntax error bei else ? Java Basics - Anfänger-Themen 3
H wieso fehler ? must return a type of int. Java Basics - Anfänger-Themen 4
M Wieso zeichnet es nicht auf den JPanel Java Basics - Anfänger-Themen 7
V Wieso NullPointerException Java Basics - Anfänger-Themen 7
M Wieso finden andere nicht die main .class Java Basics - Anfänger-Themen 20

Ähnliche Java Themen

Neue Themen


Oben