Erste Schritte Primzahlen-ArrayIndexOutOfBounds

Nikolai98

Neues Mitglied
Hey,

ich bin relativ neu in Java und habe Schwierigkeiten bei einer Aufgabe die ich lösen möchte.

Und zwar würde ich gerne einen Array mit Primzahlen füllen. Dies funktioniert auch, allerdings werden die Stellen des Arrays, welche keine Primzahlen sind mit 0 gefüllt. Da ich nicht wusste wie man das behebt, habe ich nun einfach versucht einen zweiten Array zu erstellen und diesen nur mit den Stellen aus dem ersten Array zu füllen welche nicht gleich 0 sind. Hierbei springt mein Array allerdings immer out of Bounds und ich weiß nicht warum.

Ich würde mich über eure Hilfe freuen, gerne auch Vorschläge wie man das ganze eleganter lösen kann ;)

Java:
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);
        int berreich = scanner.nextInt();
       
      //  Scanner jedeXte = new Scanner(System.in);
      //  int jedeXte2 = scanner.nextInt();

        int[] primzahl = new int[berreich];
        int primzahlRealLänge = 0;
        boolean istPrimzahl;
       
       
        for (int i = 2; i <berreich; i++) {
           
            istPrimzahl = true;
           
            for (int j = 2; j < i; j++) {
               
                if ((i % j) == 0) {
                    istPrimzahl = false;
                    break;
                }
            }
           
            if (istPrimzahl) {
                primzahl[i] = i;
                //System.out.println(primzahl[i]);
               
            }
        }
       
       
        for (int i = 0; i < berreich; i ++) {

            System.out.println(primzahl[i]);
        }
       
       
       
        for (int i = 0; i<berreich; i ++) {
            if (primzahl[i] != 0 ) {
                primzahlRealLänge = primzahlRealLänge + 1;
            }
        }
       
        System.out.println(primzahlRealLänge);
       
        int [] primzahlReal = new int [primzahlRealLänge];
       
        for (int i = 0; i < berreich; i++) {
            if (primzahl[i] != 0) {
                primzahl[i] = primzahlReal[i];
            }
        }
       
       
       
//        for (int i = 0; i < primzahlRealLänge; i ++) {
//  
//            System.out.println(primzahlReal[i]);
//        }
}
}
 

httpdigest

Top Contributor
Der Fehler ist erstmal kein Compiler-Fehler, sondern ein Laufzeitfehler (das Problem tritt erst zur Laufzeit auf).
Desweiteren liegt die Ursache darin, dass du den gesamten Bereich von 1..N in der letzten Schleife durchläufst, aber das Array `primzahlReal` nicht so groß ist.
Mögliche Lösung: Erstmal ein Array aufmachen, bei dem nicht der Index `i` für die Zahl `i` steht, sondern für die `i`-te Primzahl. Und dann am Schluss noch das Array "stutzen", je nachdem, wieviele Primzahlen tatsächlich gefunden und in das Array geschrieben wurden:
Java:
public static void main(String[] args) {
  Scanner scanner = new Scanner(System.in);
  int N = scanner.nextInt();
  int[] kandidaten = new int[N];
  int num = 0;
  for (int i = 1; i <= N; i++) {
    boolean prim = true;
    for (int j = 2; prim && j <= Math.sqrt(i); j++)
      prim &= i % j != 0;
    if (prim)
      kandidaten[num++] = i;
  }
  int[] primzahlen = Arrays.copyOf(kandidaten, num);
  System.out.println(Arrays.toString(primzahlen));
}
 

httpdigest

Top Contributor
@httpdigest es kann noch optimiert werden?
Na aber sicher doch :)
Java:
public static void main(String[] args) {
  int N = new java.util.Scanner(System.in).nextInt();
  java.util.BitSet sieb = new java.util.BitSet(N);
  java.util.stream.IntStream
   // alle Zahlen von 2 bis (einschließlich) N
   .rangeClosed(2, N)
   // nur noch nicht ausgesiebte Zahlen
   .filter(i -> !sieb.get(i))
   // siebe Vielfaches von dieser Zahl 'i' aus
   .peek(i -> java.util.stream.IntStream
             .iterate(i, j -> j <= N, j -> j + i)
             .forEach(sieb::set))
   // Hau alle Primzahlen raus!
   .forEach(System.out::println);
}
 
X

Xyz1

Gast
So meinte ich das nicht, Du hast jetzt DSDE funktional umgesetzt. ;)
BitSet Einsparungen sind auch fragwürdig.

Ne ich meinte einfach Deinen Algo aus Beitrag #2
 

httpdigest

Top Contributor
Vielleicht meint er auch, dass man den Upper-Bound der π-Funktion abschätzen kann, um das Ergebnisarray π(N) statt N Einträge groß zu alloziieren:
Java:
private static int π(int x) {
  // https://arxiv.org/pdf/1706.09803.pdf
  if (x < 60184)
    return (int) Math.ceil(x / Math.log(x) * (1 + 3 / (2 * Math.log(x))));
  return (int) Math.ceil(x / (Math.log(x) - 1.1));
}
...
public static void main(String[] args) {
  ...
  int[] kandidaten = new int[π(N)];
 

httpdigest

Top Contributor
Okay, in diesem Fall war es nur eine reine Frage aus Neugierde, wieviele Primzahlen bis N es eigentlich gibt. Surely hat da irgendjemand schon irgendeine Formel für. Und so kommt man vom einen zum nächsten.
 
X

Xyz1

Gast
Frag @Tobias-nrw , ist ja bestimmt seine Idee. :D
Habe ich das irgendwo angedeutet?

Ne ich meinte die zuhilfenahme
dass Primzahlen > 2 ungerade sind
verringert dann (insofern nicht funktional programmiert) die Laufzeit um zusätzliche 50 %.

Vielleicht meint er auch, dass man den Upper-Bound der π-Funktion abschätzen kann
Ist das genau? Gilt es für alle x? (Vermutlich nicht). :(

Also Beitrag #2 könnte eine akzeptable Lösung "andeuten", insofern Du die nicht funktional geschrieben hättest. :rolleyes: Außerdem habe ich nirgendwo geschrieben ich sei der Primzahlen-Guru ...

@Nikolai98 , Brauchst Du N Primzahlen
ODER alle Primzahlen bis N? Das stellt hier einen gewichtigen Unterschied dar. :rolleyes:
 
X

Xyz1

Gast
EDIT: korrekterweise müsste es lauten: höchstens 268420385630264 :)
Und da ist ja das Problem, keine genaue Angabe machen zu können. :rolleyes:

Der Intervallabschnitt ist zu hoch und zu groß. Und natürlich, etwas schwammig, gäbe es eine genaue Formel dafür, so würde Wolfram Alpha diese angeben.

Es kann aber auch sein das ich mich wieder etwas aus dem Fenster gelehnt habe... und es bei WA iewann angegeben werden wird. :rolleyes:

Wir können uns jetzt noch über die Begriffe genau sowie zu hoch und zu groß streiten. :D (Sieht man davon ab, dass sich diese aus dem Kontext ergeben könnten) :(
 

httpdigest

Top Contributor
Es ging doch niemals darum, genau zu sein. Die Abschätzung ist aber immer noch sehr viel besser als keine Abschätzung, bzw. als einfach N zu verwenden.
 

mihe7

Top Contributor
Und da ist ja das Problem, keine genaue Angabe machen zu können.
Das ist kein Problem, da es hier um Komplexität geht.

Nehmen wir mal die binäre Suche in einer sortierten Liste. Dort hast Du eine Laufzeitkomplexität von O(log n). Du wirst zustimmen, dass diese Suche einer linearen Suche mit einer Komplexität von O(n) vorzuziehen ist. Du kannst aber nicht genau sagen, nach wie vielen Schritten Du den Herrn Müller gefunden hast. Das spielt letztlich keine Rolle: die Schrittzahlfunktion der binären Suche wächst nicht wesentlich schneller als log n und die der linearen Suche nicht wesentlich schneller als n.

Genau das gleiche haben wir hier auch - nur eben nicht (direkt) auf Laufzeit sondern auf Platz bezogen. Nimmst Du ein Array mit n Elementen, hast Du eine Platzkomplexität von O(n) (bzw. Θ(n)). Nimmst Du ein Array mit n/log n Elementen eben von O(n/log n).

Vereinfacht: ist es besser 10^16 oder 2,69*10^14 Elemente reservieren zu müssen?
 
X

Xyz1

Gast
Also jetzt mal realistisch... :rolleyes:

In diesem Zahlenbereich ( https://de.wikipedia.org/wiki/Zahlennamen#Billion,_Billiarde_und_darüber_hinaus -> 9 Billiarden bis 19 Billiarden (ja das musste ich nachgucken (ja du hast beim Zitat meine Zahlen verdreht :rolleyes: ))), in diesem Zahlenbereich nützt eine obere Platzabschätzung (also z. B. new int[N + 1000] oder new int[N + 10000]) (praktisch) NIX mehr, da diese immer noch ungenau sein könnte.

Es kommt einfach auf die Frage des TE an... Möchte ich/er/sie/es genau N Primzahlen oder mindestens / höchstens N Primzahlen ermitteln... Das ist mir noch nicht so genau klar. ;) (Sorry wegen des Wortspiels o_O )

Dennoch Danke ich euch beiden für die ganzen, fachlichen Erläuterungen zu dieser Sache. (die ich noch nicht kannte):)

Bearbeitung(!!!) ODER in etwa N Primzahlen!
 
Zuletzt bearbeitet von einem Moderator:
Ähnliche Java Themen
  Titel Forum Antworten Datum
iAmFaiinez Primzahlen Tester ohne Array Java Basics - Anfänger-Themen 4
sserio Wieso werden nicht alle Primzahlen bis 1000 in meine Liste gepackt ? Java Basics - Anfänger-Themen 8
B Primzahlen bis 100 addieren Java Basics - Anfänger-Themen 16
H Primzahlen finden - Zeit optimieren Java Basics - Anfänger-Themen 34
S Primzahlen in Array ausgeben Java Basics - Anfänger-Themen 14
M Array auf Primzahlen prüfen Java Basics - Anfänger-Themen 7
D Primzahlen Rechner nach Eratostenes von Kyrene Algorithmus Java Basics - Anfänger-Themen 2
fendix Compiler-Fehler Algorithmus zur Bestimmung von Primzahlen Java Basics - Anfänger-Themen 7
P Methode die ausgibt wie viele Primzahlen es zwischen 2 und n gibt Java Basics - Anfänger-Themen 10
G Primzahlen von Rekursiv nach Iterativ Java Basics - Anfänger-Themen 6
M Rekursives Programm zum Anzeigen von Primzahlen Java Basics - Anfänger-Themen 3
P Primzahl mit Angabe der höchsten Primzahl und Angabe der Anzahl von Primzahlen bis 100 Java Basics - Anfänger-Themen 8
Java The Hutt Primzahlen - die ersten 100 Java Basics - Anfänger-Themen 17
R Primzahlen Zähler Programm / Benachbarte Primzahlen Java Basics - Anfänger-Themen 30
D Klassen Primzahlen überprüfen Java Basics - Anfänger-Themen 3
I Primzahlen Java Basics - Anfänger-Themen 17
Z Rekursion Primzahlen Java Basics - Anfänger-Themen 1
M Erste Schritte primzahlen ermitteln, nur zahlen als eingabe erlauben Java Basics - Anfänger-Themen 34
S Primzahlen berechnen funktioniert nicht richtig Java Basics - Anfänger-Themen 1
R primzahlen im array Java Basics - Anfänger-Themen 33
M Primzahlen, nur jede 2te ausgeben Java Basics - Anfänger-Themen 11
T Primzahlen Fehler Java Basics - Anfänger-Themen 4
K Primzahlen Java Basics - Anfänger-Themen 6
L Primzahlen im Array ausgeben Java Basics - Anfänger-Themen 3
P Primzahlen Java Basics - Anfänger-Themen 3
A Methoden Primzahlen erstellen von 1 bis 100-Codeprobleme Java Basics - Anfänger-Themen 2
H Variablenverfolgung - Primzahlen Java Basics - Anfänger-Themen 7
G Primzahlen Java Basics - Anfänger-Themen 6
D Primzahlen und Rekursive Liste Java Basics - Anfänger-Themen 29
S Primzahlen bis 1000 ausgeben Java Basics - Anfänger-Themen 3
K Methoden Primzahlen Java Basics - Anfänger-Themen 33
S Input/Output Primzahlen Datenbank Java Basics - Anfänger-Themen 11
F Primzahlen in Zahlenblöcken ausgeben Java Basics - Anfänger-Themen 9
M Primzahlen - es werden alle Nicht-Primzahlen ausgegeben Java Basics - Anfänger-Themen 5
M primzahlen Java Basics - Anfänger-Themen 4
S Programm zu Ermittlung von Primzahlen Java Basics - Anfänger-Themen 14
E Programm zum Primzahlen ausgeben-Fehler Java Basics - Anfänger-Themen 12
X Primzahlen Java Basics - Anfänger-Themen 7
S Primzahlen Java Basics - Anfänger-Themen 12
B Programmierobjekt - Primzahlen Java Basics - Anfänger-Themen 2
D Primzahlen ausgeben. Wo liegt der Fehler? Java Basics - Anfänger-Themen 4
N Primzahlen Java Basics - Anfänger-Themen 5
I Primzahlen check, String prüfen lassen. Java Basics - Anfänger-Themen 6
A OOP Programm zum bestimmen von Primzahlen, OutofBoundsException Java Basics - Anfänger-Themen 10
apple987123 Primzahlen Java Basics - Anfänger-Themen 12
A Primzahlen: ein paar offene Fragen Java Basics - Anfänger-Themen 2
T Primzahlen Java Basics - Anfänger-Themen 6
G Primzahlen Java Basics - Anfänger-Themen 18
B Primzahlen berechnen - Wieso unterschiedliche Java Basics - Anfänger-Themen 3
B Primzahlen Algorithmus - wo ist der Fehler ? Java Basics - Anfänger-Themen 2
E Primzahlen Java Basics - Anfänger-Themen 5
B Primzahlen mit Array errechnen! Java Basics - Anfänger-Themen 13
H Miller Rabin Test Primzahlen werden teilweise nicht gefunden Java Basics - Anfänger-Themen 5
M Wer kann mir bei Primzahlen helfen ? Java Basics - Anfänger-Themen 4
G Frage zur Primzahlen berechnung Java Basics - Anfänger-Themen 11
kulturfenster Primzahlen berechnen Java Basics - Anfänger-Themen 11
D Primzahlen Java Basics - Anfänger-Themen 4
N Zerlegung in Primzahlen Java Basics - Anfänger-Themen 7
F Programm Primzahlen Java Basics - Anfänger-Themen 5
J Primzahlen errechnen.ArrayLists abgleichen Java Basics - Anfänger-Themen 2
M Primzahlen Java Basics - Anfänger-Themen 6
C Primzahlen Java Basics - Anfänger-Themen 7
C Primzahlen Java Basics - Anfänger-Themen 2
S Primzahlen Java Basics - Anfänger-Themen 49
J ArrayIndexOutOfBounds Java Basics - Anfänger-Themen 11
B Problem mit (De)Chiffrieralgorithmus: ArrayindexoutofBounds Java Basics - Anfänger-Themen 3
G ArrayIndexOutOfBounds Java Basics - Anfänger-Themen 4
N Fehler ArrayIndexOutOfBounds und kein Plan was zu tun ist Java Basics - Anfänger-Themen 4
O arrayindexoutofbounds finde den fehler nicht Java Basics - Anfänger-Themen 6
R ArrayIndexOutOfBounds Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben