Java Primzahlberechnung (Primzahlen in Array speichern)?

3 Antworten

Arrays haben ein fixe Größe, du kannst die nicht Dynamisch anpassen. Deshalb auch der Out of Bounds fehler.

Wenn du unbedingt mit Arrays arbeiten willst, versuch es mal mit einer ArrayList. Doku. -> https://docs.oracle.com/javase/6/docs/api/java/util/ArrayList.html

Woher ich das weiß:Berufserfahrung – Fachkraft für Lagerlogistik / Support Computer Fachhandel

Die Fehlermeldung bedeutet, dass du versuchst, auf das Element mit der Nummer zuzugreifen, die nicht mehr im Array ist.

Du kannst nicht das 201-te Element eines 200-elementigen Arrays abfragen.

MoonSpirit 
Fragesteller
 03.12.2019, 19:55

Okay Danke. Hättest du dann einen Verbesserungsvorschlag für mich?

0
MoonSpirit 
Fragesteller
 03.12.2019, 20:30
@PerfectMuffin

Das hier wäre mein kompletter Code: Danke ;)

import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

/**

 * Write a description of class Prime_fast here.

 * 

 * @author (your name) 

 * @version (a version number or a date)

 */

public class CPrime_9_array extends Primes

{

  public void init() 

  {

    //Ich will so viele Primzahlen: 

    prime(200);

  }  

   

  public void prime(int benoetigtePrimzahlen){

    //WARTEZEIT usw.

    long timeStart = System.currentTimeMillis();

    long timeStop = 0;

     

    long timeWartezeit = 0;

    long timeKommaWartezeit = 0;

     

    int getesteteZahlen = 0;

    int erwuenschteAnzahl = benoetigtePrimzahlen;

    //--------------------------------------------------

     

    //ARRAY für PRIMZAHLEN

    

    int[] arrayPrimes = new int[benoetigtePrimzahlen];

    arrayPrimes[0] = 2;

    arrayPrimes[1] = 3;

    arrayPrimes[2] = 5;

    int i = 0;

    

    //--------------------------------------------------

     

    //Primzahl test:

    float testCounter = 0;

    boolean testPrimzahl = false;

    int testZaehler = 0;

    int testTeiler= 0;

     

    //stinknormaler hochzähler

    int counter = 2;

     

     

    while (benoetigtePrimzahlen!=0){

      //nicht durch 2 oder 5 teilbar

      if(!(counter%2==0)&& !(counter%5==0) || (counter==2) || counter==5){

        testPrimzahl = false;

         

        //IST PRIMZAHL?

        testCounter = counter;

        testZaehler = 0;

        while ((testTeiler < counter) || (testZaehler < counter) || (testPrimzahl == false)){

          testTeiler = arrayPrimes[testZaehler];

          testCounter = testCounter / testTeiler;

          if( (testCounter - (int)testCounter) == 0){

            System.out.println("Primzahl: " + counter);

             

            //in Array speichern

            arrayPrimes[i] = counter;

            i ++;

             

            //Eine Primzahl weniger!

            benoetigtePrimzahlen--;

            testPrimzahl = true;

          }else{

            testZaehler ++;

          }

        }

      }

       

      getesteteZahlen++;

      counter ++;

    }

     

     

    System.out.println("Erw�nschte Anzahl an Primzahlen: " + erwuenschteAnzahl);

    System.out.println("Anzahl als Primzahl getestete Zahlen(m�glichst gering): " + getesteteZahlen);

    //WARTEZEIT

    timeStop = System.currentTimeMillis();

    timeWartezeit = timeStop - timeStart;

    if (timeWartezeit < 1000){

      System.out.println("Wartezeit in Millisekunden:" + timeWartezeit);

    }

    else {

      timeKommaWartezeit = timeWartezeit - 1000;

      timeWartezeit = timeWartezeit /1000;

      System.out.println("Wartezeit in Sekunden:" + timeWartezeit + "," + timeKommaWartezeit);

    }

  }

}

0

Ein Array hat eine feste Größe, die bereits bei Erstellung festgelegt wird. Bei dir wird nun testZaehler irgendwann den erlaubten Indexbereich überschreiten und es kommt zu dem Ausnahmefall.

Du könntest nun schauen, wieso testZaehler irgendwann <= benoetigtePrimzahlen wird (und dies beschränken) oder die Größe des Arrays jedesmal erweitern, bevor du an dessen Grenzen stößt (indem du ein neues Array mit mehr Plätzen anlegst und die alten Werte in das neue Array hineinkopierst). Statt der Arrayvergrößerung wäre ebenso eine Liste als Datentyp eine Option.

Generell habe ich irgendwie den Eindruck, dass du viel zu viele Variablen anlegst, die zudem auch noch nicht gut benannt werden. Bereits der Mix aus Englisch und Deutsch macht deinen Code nicht gut lesbar (Bsp.: Wo liegt nun der Unterschied zwischen counter, testZaehler und testCounter?)

Das Leerzeichen bei der Nutzung des De-/Inkrementoperators solltest du im Übrigen auch weglassen.

i ++;  // not good
i++;

Du machst es ja nicht einmal stringent.