Последовательность простых чисел путем реализации интерфейса (Java) - PullRequest
0 голосов
/ 28 ноября 2011

В качестве примера мне дан интерфейс последовательности и класс последней цифры распределения, а также классы последовательности квадрата. Теперь мне нужно придумать последовательность простых чисел, которая реализует интерфейс последовательности. Я придумал алгоритм, но у меня возникли проблемы с тем, что я собираюсь реализовать интерфейс или вернуть значение.

Последний класс рассылки

public class LastDigitDistribution
{
   private int[] counters;

   // Constructs a distribution whose counters are set to zero.
   public LastDigitDistribution()
   {
     counters = new int[10];
   }

  /**
     Processes values from this sequence.
     @param seq the sequence from which to obtain the values
     @param valuesToProcess the number of values to process
  */
  public void process(Sequence seq, int valuesToProcess)
  {
    for (int i = 1; i <= valuesToProcess; i++)
     {
        int value = seq.next();
        int lastDigit = value % 10;
        counters[lastDigit]++;
     }
  }

  // Displays the counter values of this distribution.
  public void display()
  {
    for (int i = 0; i < counters.length; i++)
    {
        System.out.println(i + ": " + counters[i]);
    }
  }
}

Интерфейс последовательности

public interface Sequence
{
    int next();
}

Класс SquareSequence

public class SquareSequence implements Sequence
{
    private int n;

    public int next()
    {
        n++;
       return n*n;
    }

Класс случайной последовательности

public class RandomSequence implements Sequence
{
    public int next()
    {
        return (int) (Integer.MAX_VALUE * Math.random());
    }
}

Демонстрационный / тестовый класс для Sequence

public class SequenceDemo {

    public static void main(String[] args)
    {
          LastDigitDistribution dist1 = new LastDigitDistribution();
          dist1.process(new SquareSequence(), 100);
          dist1.display();
          System.out.println();

          LastDigitDistribution dist2 = new LastDigitDistribution();
          dist2.process(new RandomSequence(), 1000);
          dist2.display();
       }
}

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

public class SquareSequence implements Sequence
{
   private int n;

   public int next()
   {{          
        for (int i = 1; i < n; i++ ){
           int j;
           for (j=2; j<i; j++){
           int k = i%j;
           if (k==0){
           break;
           }
           }
           if(i == j){
           System.out.print("  "+i);             
           }               
       }
        return n;       
  }    
  }
}

Спасибо за помощь!

Ответы [ 3 ]

0 голосов
/ 28 ноября 2011

Вы должны назвать свой класс PrimeSequence (или подобный), чтобы описать его и заставить его реализовать интерфейс Sequence.

Затем вы должны начать где-то проверять на простое число, проще всего начать с предыдущего + 1Первое простое число равно 2, поэтому при создании класса установите последнее известное число (n) равным 1;

В методе next () у вас будет что-то вроде этого:

do {
    n += 1;
} while (!isPrime(n));
return n;

IsPrime - это метод, который возвращает true, если n - простое число, и false в противном случае.Хорошее упражнение для реализации.

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

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

Это легко. Гугл список простых чисел. Создайте List<Integer>, который содержит все простые числа, меньшие или равные Integer.MAX_VALUE. Используйте функцию .iterator для создания Iterator<Integer>, который в основном делает то, что должен делать Sequence.

Создайте класс-оболочку, который реализует Sequence на основе Iterator<Integer>. Бросьте RuntimeException, когда у Iterator<Integer> закончится простое число.

0 голосов
/ 28 ноября 2011

Во-первых, я бы назвал класс чем-то вроде PrimeSequence, но оставил бы его реализующим Sequence.Чтобы реализовать этот класс с использованием вашего алгоритма, все, что вам нужно сделать, это реализовать метод next() таким образом, чтобы он возвращал следующее простое число.

В основном инициализируйте n первым простым числом (2) при построении класса.За каждый звонок next();верните первое найденное простое число, которое больше n (ограничив ваш поиск числами n + 1 и более), а затем установите n для этого вновь найденного простого числа, прежде чем возвращать его.

...