Prime Number Sequence通过实现接口(Java)

时间:2011-11-28 19:34:50

标签: java interface primes

我给出了序列接口和最后一个分布数字类以及方形序列类作为示例。现在我必须提出一个实现序列接口的素数序列。我想出了一个算法,但是我很难实现接口或返回值。

最后分发类

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 Class

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());
    }
}

序列的演示/测试器类

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();
       }
}

现在我必须介绍一个primesequence类这是我到目前为止所提出的素数算法很好我只是不知道如何实现它并将它与这个序列联系起来。

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 :(得分:0)

首先,我将该类命名为PrimeSequence,但保持它实现Sequence。要使用您的算法实现该类,您需要做的就是以返回下一个素数的方式实现next()方法。

在构建类时,基本上将n初始化为第一个素数(2)。每次拨打next();返回您发现的大于n的第一个素数(将您的搜索限制为数字n + 1和更大),然后在返回之前将n设置为新找到的素数。

答案 1 :(得分:0)

你应该命名你的PrimeSequence(或类似的)类来描述它并让它实现接口Sequence。

然后,你必须开始测试某个地方的素数,简单是从前一个+ 1开始。第一个素数是2,所以在创建类时将最后一个已知数字(n)设置为1;

在next()方法中你会有这样的东西:

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

isPrime是一个方法,如果n是素数则返回true,否则返回false。一个很好的练习。

如果您愿意,可以进行多项优化,例如在2之后,没有素数可以是偶数,因此您只需检查其他所有数字。

答案 2 :(得分:0)

这很容易。谷歌的素数列表。创建一个List<Integer>,其中包含小于或等于Integer.MAX_VALUE的所有素数。使用.iterator函数创建一个Iterator<Integer>,它基本上完成了序列应该做的事情。

创建一个基于Iterator<Integer>实现Sequence的包装类。当RuntimeException用完素数时,抛出Iterator<Integer>