Java Primzahlberechnung (Primzahlen in Array speichern)?
Hallo, ich würde in Java gerne eine Primzahlberechnungsmethode schreiben, welche mir "x"´-Primzahlen ausspuckt. Um die Laufzeit zu verbessern, will ich die hochzählenden Zahlen nur durch Primzahlen teilen. Hierfür speichere ich alle neu gewonnenen Primzahlen in einem Array ab, und benutze sie als neuen Teiler.
Beim Laufen meiner Methode bekomme ich jedoch ständig diese Fehlermeldung:
java.lang.ArrayIndexOutOfBoundsException: Index 200 out of bounds for length 200
(Meine Methode ohne den Array klappt perfekt ;) ).
In meinem Skript ist:
benoetigtePrimzahlen: Die Erwünschte Anzahl der Primzahlen
Counter: Die Zahl die ständig hochzählt, und die als Primzahl getestet werden soll
testCounter: einfach nur eine Kopie des Counters
testZaehler: Den hochzählenden Platz des Arrays, der hochgezählt werden muss
arrayPrimes[] Das Array, in welchen die Primzahlen gespeichert werden
getestete Zahlen: erstmal wegzulassen ;)
Ich freue mich über jede Hilfe!
Danke!
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
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.
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);
}
}
}
Nope. Korrekt formatieren oder pastebin. So ist es furchtbar.
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.
Okay Danke. Hättest du dann einen Verbesserungsvorschlag für mich?