2011-11-28 14 views
-2

例として、シーケンスインタフェースと最後のディストリビューションディジットクラスと四角シーケンスクラスが与えられました。今度は、シーケンスインターフェイスを実装する素数シーケンスを考えなければなりません。私はアルゴリズムを思いついたが、私はインターフェイスを実装するか、値を返すつもりであることに問題がある。インタフェースを実装した素数シーケンス(Java)

最終配布クラス

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

今、私はこれは私がこれまでの素数のアルゴリズムを作ってみたものです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;  
    }  
    } 
} 

ありがとうございました!

+0

宿題?あなたはプライムをテストする方法を知っていますか? – taskinoor

+0

私が思いついたアルゴリズムは、あなたが定義した数の素数を印刷するので、素数をテストするコードを考え出す必要はないと思います。それは質問が私に尋ねたものではありません。 – user1069755

+0

"アルゴリズムは、あなたが定義した数の素数を印刷します" - アルゴリズムが素数であると言うか、素数をテストしないで素数を出力するか? – taskinoor

答えて

0

まず、クラスにPrimeSequenceのような名前を付けますが、Sequenceを実装しておきます。アルゴリズムを使ってそのクラスを実装するには、次の素数を返すようにnext()メソッドを実装するだけです。

基本的には、クラスの構築時にnを最初の素数(2)に初期化します。 next()への各呼び出しごとに。 n(検索回数をn + 1以上に制限する)より大きい最初の素数を返し、それを返す前に新しく見つかった素数にnを設定してください。

+0

申し訳ありません私はクラスの名前を変更することを忘れていました、私はそれを理解し、これも試してみましょう、私は何か問題があればあなたに戻ってきます。どうもありがとう! – user1069755

+0

@ user1069755どうしましたか? – Zugwalt

0

クラスPrimeSequence(またはそれに類するもの)を記述し、インターフェイスSequenceを実装する必要があります。

次に、どこかでプライムのテストを開始しなければなりません。最初のプライムは2であるため、クラスを作成するときは最後の既知数(n)を1に設定します。あなたはこのようなものだろうnext()メソッドで

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

をisPrimeは、nがそれ以外の素数とfalseの場合はtrueを返すメソッドです。実装するための良い練習。

2つの素数が偶数になる可能性がある場合は、いくつかの最適化があります。したがって、他のすべての数をチェックするだけです。

+0

はい、申し訳ありませんが、クラスのprimesequenceを編集するのを忘れてしまいました。これは私が思いついたアルゴリズムよりはるかに簡単で、シーケンスをはるかに上手く実装していますので、私が作業して試してみましょう。どうもありがとう! – user1069755

0

これは簡単です。 Googleは素数のリスト。 Integer.MAX_VALUEより小さいすべての素数を含むList<Integer>を作成します。 .iterator関数を使用して、Iterator<Integer>を作成します。この関数は、基本的にシーケンスの処理を行います。

Iterator<Integer>に基づいてシーケンスを実装するラッパークラスを作成します。 Iterator<Integer>に素数がなくなったときにRuntimeExceptionを投げてください。

+0

これは、おなかが空いている可能性があります。 –

+0

メモリ内に約pi(2^31)=(2^31)/ ln(2^31)= 99,940,775の整数のリストを保持できるコンピュータを買うだけです。正確には – emory

+0

105097565となります。ええ、標準的な答えは「より良いアルゴリズムですか?ハードウェアを投げてください! ;)新しいコンピュータを購入する前に 'List 'ではなく 'int []'を使うことをお勧めします。 –

関連する問題