【问题标题】:Prime Number Sequence by implementing a interface (Java)通过实现接口(Java)实现质数序列
【发布时间】:2011-11-28 19:34:49
【问题描述】:

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

最后一个分布类

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

序列的演示/测试类

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

感谢您的帮助!

【问题讨论】:

  • 家庭作业?你知道如何测试素数吗?
  • 我想出的算法打印出你定义的尽可能多的素数,所以我认为我不需要想出一个测试素数的代码。因为这不是问题问我的。
  • “我想出的算法可以打印出你定义的尽可能多的素数” - 该算法如何判断一个数字是否为素数并在不测试素数的情况下打印素数?

标签: java interface primes


【解决方案1】:

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

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

【讨论】:

  • 对不起,我忘记改类名了,我想我明白了,我也试试这个,如果我有任何问题,我会回复你。非常感谢!
【解决方案2】:

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

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

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

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

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

如果您愿意,可以进行多种优化,例如在 2 之后没有素数可以是偶数,因此您只需检查每隔一个数字。

【讨论】:

  • 是的,很抱歉没有命名该类 primesequence 忘记编辑它。这比我想出的算法要容易得多,并且可以更好地实现序列,所以让我工作并尝试一下。非常感谢!
【解决方案3】:

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

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

【讨论】:

  • 这可能有点内存消耗。
  • 只要买一台计算机,它可以在内存中保存大约 pi(2^31)=(2^31) / ln(2^31) = 99,940,775 个整数的列表。
  • 105097565 准确地说。是的,标准答案“更好的算法?只需投入更多的硬件!” ;) 我建议在购买新电脑之前使用int[],而不是List&lt;Integer&gt;
猜你喜欢
  • 2014-05-23
  • 2015-08-03
  • 1970-01-01
  • 2015-11-08
  • 2017-10-21
  • 2012-04-28
  • 1970-01-01
  • 2010-09-09
  • 1970-01-01
相关资源
最近更新 更多