2016-03-30 9 views
-1

ok Ich bin ein wenig Geist aus einer Aufgabe geblasen, die ich tun muss. Wir müssen eine Sequenzklasse von wiley.com/go/javaexamples (das Beispiel aus Kapitel 10) implementieren, um eine neue Klasse mit der Bezeichnung PrimeSequence zu erstellen, die die ersten 100 Prime-Sequenznummern richtig ausrichten muss. Ich verstehe den Punkt der Implementierung der anderen Klasse nicht, und ich habe es getan, aber ich weiß, dass ich den Zuordnungsregeln nicht folge, weil ich nicht verstehe, was ich von der anderen Klasse implementieren sollte, und ich auch nichts von der anderen Klasse verwende. Ich bin nicht sicher, was ichImplementierung einer anderen Klasse, um die ersten 100 Primzahlen zu erstellen

Sequence Klasse

public interface Sequence 
{ 
    int next(); 
} 

PrimeSequence Klasse

public class PrimeSequence implements Sequence 
{ 

public PrimeSequence() 
{ 

} 

public boolean isPrime(int x) 
{ 
    for (int start = 2; start <= Math.sqrt(x); start++) 
    { 
     if (x % start == 0) 
     { 
      return false; 
     } 
    } 
    return true; 
} 

    public int next() 
    { 

    } 
} 

PrimeSequenceTester

public class PrimeSequenceTester { 


public static void main(String[] args) 
{ 
    PrimeSequence prime = new PrimeSequence(); 

    int currentNumber = 2; 
    int primesFound = 0; 

    while (primesFound < 100) { 
     if (prime.isPrime(currentNumber)) 
     { 
      primesFound++; 

      System.out.printf("%4s",currentNumber + " "); 
      if (primesFound % 10 == 0) 
      { 
       System.out.println(); 
      } 
     } 

     currentNumber++; 
} 
} 
+1

erfahren Sie, wofür eine Schnittstelle ist. –

+0

Ich bekomme, dass die Implementierung können Sie abstrakte Methoden verwenden, aber ich weiß nicht, wie man das hier anwenden –

Antwort

0

Hier eine Beispielimplementierung zu tun haben, ist mit einem Sieb von Eratosthenes (nur die ungeraden Zahlen gesiebt) und optimiert, um Zahlen nur einmal über Multi zu sieben ple Instanzen der Sequenz. Sie müssen etwas tun LOT einfacher und nur verfolgen, was die aktuelle Primzahl ist und überschreiben die next() Funktion, so dass, wenn es aufgerufen wird, erhöhen Sie den Wert der aktuellen Prime, bis Ihre isPrime() Funktion gibt True und dann zurück dieser Wert.

import java.util.BitSet; 

public class PrimeSequence implements Sequence { 
    private static final BitSet OddPrimeSieve = new BitSet(8000); 
    private static int MaxSievedPrime = 2; 

    static { 
     OddPrimeSieve.set(0, OddPrimeSieve.size() - 1, true); 
    } 

    private static int PrimeToIndex(final int prime){ 
     return (prime - 3)/2; 
    } 

    private static int IndexToPrime(final int index){ 
     return 2*index + 3; 
    } 

    private static synchronized void setMaxSievedPrime(final int max){ 
     MaxSievedPrime = max; 
     for (int index = PrimeToIndex(MaxSievedPrime) + MaxSievedPrime; 
       index < OddPrimeSieve.length(); 
       index += MaxSievedPrime) 
      OddPrimeSieve.set(index, false); 
    } 

    int currentPrime = 2; 

    @Override 
    public synchronized int next() { 
     final int current = currentPrime; 
     if (current == 2) 
     { 
      currentPrime++; 
     } 
     else 
     { 
      if (currentPrime > MaxSievedPrime) 
       setMaxSievedPrime(currentPrime); 
      currentPrime = IndexToPrime(OddPrimeSieve.nextSetBit(PrimeToIndex(currentPrime) + 1)); 
     } 
     return current; 
    } 

    public static void main(final String[] args){ 
     PrimeSequence p = new PrimeSequence(); 
     for (int i = 0; i < 100; i++) 
      System.out.println(p.next()); 
    } 
}