2010-11-28 10 views
3

Ich denke, der Konstruktor ist logisch korrekt, ich kann einfach nicht herausfinden, wie man es im Wesentlichen nennt! :) Kann mir bitte jemand helfen? Wenn jemand nur einen kurzen Blick auf meinen Code werfen würde, wäre es nett :) Vielen Dank!Was ist falsch an meiner Implementierung dieses Algorithmus zur Berechnung der ersten N Primzahlen?

Auch ich benutze ArrayLists in dieser Implementierung und ich muss es so tun, damit ich es nicht ändern möchte, obwohl es viel einfacher mit nur Arrays implementiert wird.

import java.util.*; 
public class PrimeNumberss { 
    public static void main(String args []){  
     PrimeNumberss PrimeNumbers = new PrimeNumberss(10); 
    } 

    public PrimeNumberss (int initialCapacity) { 
     ArrayList<Integer> listOfPrimeNumbers = new ArrayList<Integer>(initialCapacity); 
     long numberOfPrimes = 0; //Initialises variable numberOfPrimes to 0 
     int start = 2; 
     boolean[] isPrimeNumber = new boolean[initialCapacity + 1]; 

     for (int i=0;i==initialCapacity;i++) {//setting all values in array of booleans to true 
     isPrimeNumber[i] = true; 
     } 

     while (start != initialCapacity) 
     { 
      if (isPrimeNumber[start]) 
      { 
      listOfPrimeNumbers.add(start); 
      //add to array list 
      numberOfPrimes++; 

      for (int i = start; start < initialCapacity; i+=start) 
      { 
       isPrimeNumber[i] = false; 
      } 

      } 

      start++; 
     } 
    } 
} 
+1

Was ist das Problem? Wenn Sie einen Fehler erhalten, geben Sie bitte die Details an. Wenn das Ergebnis nicht wie erwartet ist, geben Sie bitte Details an –

+1

Es sieht so aus, als ob Sie es gut nennen, was genau ist das Problem? –

+0

Entschuldigung für den Mangel an Details! Ich wollte den Konstruktor, den ich anrufe, testen, um die ersten 10 Primzahlen auszugeben. Wenn ich es laufe, druckt es nichts. Ich weiß, dass ich etwas Dummes vergessen habe, aber ich sterbe im Moment müde und kann es einfach nicht sehen! – user476033

Antwort

3
  1. Ihr Algorithmus ist nicht korrekt; Sie werden nur die Primzahlen finden, die kleiner als N sind (Ihre anfängliche Kapazität), nicht die ersten N Primzahlen.
  2. Wenn Sie jede Primzahl speichern möchten, sollten Sie sie in einer Klassenvariablen und nicht in einer Variablen lokal im Konstruktor speichern. Sie können nicht auf sie außerhalb des Konstruktors zugreifen, wenn Sie dies tun.
  3. Sie sollten die Liste mit einer Getter-Methode verfügbar machen, um den Zugriff darauf zu ermöglichen.
  4. Sie drucken nichts im Konstruktor.
0

Alles wichtige ist da, seine kleinen Änderungen. Im Moment bekommst du Primzahlen, die kleiner sind als N, also wenn du es in erste N Primzahlen umwandeln willst, wird das ein echter funktionaler Unterschied sein. Für jetzt lassen Sie einfach N = 50 machen, so dass Sie weit über 10 Primzahlen bekommen.

public class PrimeNumberss { 

    private List listOfPrimeNumbers; //add a member variable for the ArrayList 

    public static void main(String args []){  
     PrimeNumberss PrimeNumbers = new PrimeNumberss(50); 
     PrimeNumbers.print(); //use our new print method 
    } 

public PrimeNumberss (int initialCapacity) { 
    listOfPrimeNumbers = new ArrayList<Integer>(initialCapacity/2); //initialCapacity/2 is an easy (if not tight) upper bound 
    long numberOfPrimes = 0; //Initialises variable numberOfPrimes to 0 
    int start = 2; 
    boolean[] isPrimeNumber = new boolean[initialCapacity + 1]; 

    for (int i=0;i==initialCapacity;i++) {//setting all values in array of booleans to true 
    isPrimeNumber[i] = true; 
    } 

    //.... complete the constructor method as you have it. honestly, i didnt even read it all 

public void print() //add this printout function 
{ 
    int i = 1; 
    it = listOfPrimeNumbers.listIterator(); 
    while (it.hasNext()) 
    { 
      System.out.println("the " + i + "th prime is: " + it.next()); 
      i++; 
    } 
    //or just System.out.println(listOfPrimeNumbers);, letting ArrayList's toString do the work. i think it will be in [a,b,c,..,z] format 
} 

public List getPrimes() {return listOfPrimeNumbers;} //a simple getter isnt a bad idea either, even though we arent using it yet 
} 

Auf einer Seite zur Kenntnis, könnte man wahrscheinlich d oa wenig besser mit der Namensgebung (PrimeNumberss und PrimeNumbers ??), aber ich habe nicht irgendetwas davon ändern. IntiialCapacity spiegelt nicht, was es wirklich bedeutet. Vielleicht etwas nach dem Motto "top".

1

i == initialCapacity ist eindeutig falsch.

+0

Warum ist das falsch? Ich verstehe nicht.] – user476033

+0

Weil, wenn initialCapacity gleich null ist, die Schleife niemals ausgeführt wird. – EJP

Verwandte Themen