2010-11-28 29 views
3

Je pense que le constructeur est logiquement correct, je n'arrive pas à comprendre comment l'appeler dans le principal! :) Quelqu'un peut-il aider s'il vous plaît ? Si quelqu'un regardait rapidement mon code, ce serait bien :) Merci beaucoup!Quel est le problème avec ma mise en œuvre de cet algorithme pour calculer les N premiers nombres premiers?

De plus, j'utilise arrayLists dans cette implémentation et je dois le faire de cette façon, donc je ne souhaite pas le changer, même s'il est beaucoup plus facilement implémenté en utilisant uniquement des tableaux.

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

Quel est le problème? Si vous obtenez une erreur, veuillez fournir des détails. Si le résultat ne correspond pas aux attentes, veuillez donner des détails –

+1

Il semble que vous l'appeliez bien, quel est exactement le problème? –

+0

Toutes mes excuses pour le manque de détails! Je voulais tester le constructeur que j'appelle en l'imprimant sur les 10 premiers nombres premiers. Quand je le lance, il n'imprime rien. Je sais que j'ai oublié quelque chose de stupide, mais je suis en train de mourir fatigué en ce moment et je ne peux tout simplement pas le voir! – user476033

Répondre

3
  1. Votre algorithme est incorrect; vous ne trouverez que les nombres premiers inférieurs à N (votre capacité initiale), pas les N premiers nombres premiers.
  2. Si vous stockez chaque prime, vous devez les stocker dans une variable de classe qui n'est pas une variable locale au constructeur. Vous ne pourrez pas y accéder en dehors du constructeur si vous le faites.
  3. Vous devez exposer la liste à l'aide d'une méthode getter pour leur donner accès.
  4. Vous n'imprimez rien dans le constructeur.
0

Tout est important, ses petits changements. En ce moment, vous obtenez des nombres premiers inférieurs à N, donc si vous voulez le changer en N premiers nombres, cela va être une vraie différence fonctionnelle. Pour l'instant, il suffit de faire N = 50 pour obtenir plus de 10 nombres premiers.

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 
} 

Sur une note côté, vous pourriez probablement d oa peu mieux avec la dénomination (PrimeNumberss et PrimeNumbers ??), mais je na pas changer tout cela. De plus, intiialCapacity ne reflète pas ce que cela signifie réellement. Peut-être quelque chose dans le genre de «top».

1

i == initialCapacité est clairement fausse.

+0

Pourquoi est-ce faux? Je ne comprends pas.] – user476033

+0

Parce que, sauf si initialCapacity est zéro, la boucle ne s'exécutera jamais. – EJP