Что плохого в моей реализации этого алгоритма для вычисления первых N простых чисел? - PullRequest
3 голосов
/ 29 ноября 2010

Я думаю, что конструктор логически правильный, я просто не могу понять, как его вызвать в основном! :) Может кто-нибудь помочь, пожалуйста? Если бы кто-то просто быстро просмотрел мой код, было бы неплохо :) Большое спасибо!

Кроме того, я использую arrayLists в этой реализации, и я должен сделать это таким образом, поэтому я не хочу менять его, даже если это гораздо проще реализовать, используя только массивы.

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++;
        }
    }
}

Ответы [ 3 ]

3 голосов
/ 29 ноября 2010
  1. Ваш алгоритм неверен; вы найдете только простые числа меньше N (вашей начальной емкости), а не первые N простых чисел.
  2. Если вы собираетесь хранить каждое простое число, вы должны хранить их в переменной класса, а не в локальной для конструктора переменной. Вы не сможете получить доступ к ним вне конструктора, если вы это сделаете.
  3. Вы должны предоставить список, используя метод получения, чтобы обеспечить доступ к ним.
  4. Вы ничего не печатаете в конструкторе.
1 голос
/ 29 ноября 2010

i == initialCapacity явно неверен.

0 голосов
/ 29 ноября 2010

Все важное здесь, его небольшие изменения. Прямо сейчас вы получаете простые числа меньше N, так что если вы хотите изменить его на первые N простых чисел, это будет реальная функциональная разница. А пока давайте просто сделаем N = 50, чтобы вы поправились за 10 простых чисел.

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
}

Кстати, с именами вы могли бы немного лучше (PrimeNumberss и PrimeNumbers ??), но я ничего не изменил. Кроме того, intiialCapacity не отражает то, что он действительно означает. Может быть, что-то вроде «вершины».

...