Ich habe Sieve of Eratosthenes
zum Auffinden der Liste der Primzahl von 1 bis n implementiert. Mein Code funktioniert gut für Eingänge von 1 bis 10.000, aber ich bin immer für Werte folgend> 100.000:Algorithmus: Liste alle Primzahl mit Sieb von Eratosthenes
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -2146737495
at SieveOfEratosthenes.main(SieveOfEratosthenes.java:53)
Ich bin in der Lage, das Problem zu finden, die in dem for-Schleife ist, wenn ich i * i
tue, wie es ist gehen aus dem Integer-Bereich (Integer.MAX_VALUE
), aber ich konnte die Lösung nicht finden. Kann mir jemand vorschlagen, welche Änderungen vorgenommen werden können? Ich schätze es auch, wenn mir jemand eine Verbesserung der Effizienz bei dieser Implementierung vorschlägt?
public class SieveOfEratosthenes {
public static void main(String[] args) {
Integer num = Integer.parseInt(args[0]);
Node[] nodes = new Node[num + 1];
for(int i = 1; i < nodes.length; i++) {
Node n = new Node();
n.setValue(i);
n.setMarker(true);
nodes[i] = n;
}
for(int i = 1; i < nodes.length; i++) {
if(nodes[i].getMarker() && nodes[i].getValue() > 1) {
System.out.println("Prime " + nodes[i].getValue());
} else {
continue;
}
for(int j = i * i; j < nodes.length
&& nodes[i].getMarker(); j = j + i) {
nodes[j].setMarker(false);
}
}
System.out.println(l.size());
}
}
class Node {
private int value;
private boolean marker;
public void setValue(int value) {
this.value = value;
}
public int getValue() {
return this.value;
}
public void setMarker(boolean marker) {
this.marker = marker;
}
public boolean getMarker() {
return this.marker;
}
public String toString() {
return ("Value : " + marker + " value " + value);
}
}
Ich habe auch versucht 'Math.abs (j)
Vishrant
@ScaryWombat Ich habe das bereits versucht, und ich habe gelernt, dass Array nicht zugegriffen werden kann langen Wert verwenden. seine in Java docs – Vishrant
http://stackoverflow.com/questions/30805300/accessing-an-array-element-if-using-long-datatype-in-java das wird Ihnen helfen – Vishrant