2016-05-22 9 views
1

Ich arbeitete mit Codierung in Java und ich bin in diesem Code stecken, die ich zum Auffinden von Primzahlen implementiert habe.So finden Sie Primzahlen mit einer ArrayList in Java

public class PrimeList { 

    ArrayList<Integer> list; 

    public PrimeList(int n){ 

     list = new ArrayList<Integer>(); 

     preparePrimeList(n); 
    } 

    private void preparePrimeList(int n){ 
     int c =0; 
     for (int i=0; i<=n; i++) { 

      if (i%2!=0 && i%3!=0 && i%5!=0 && i%7!=0) { 
       list.add(i); 
       c++; 
      } 
     } 

     list.remove(0); 
     list.remove(1); 
    } 
    public void printPrimeList(){ 
     System.out.println(list); 
    } 
    public boolean isPrime(int nbr){ 

      if (list.contains(nbr)) { 
       return true; 
     } 
     return false; 
    } 


    public static void main(String[] args) { 

     PrimeList primes = new PrimeList(100); 
     primes.printPrimeList(); 
     primes.isPrime(33); 

    } 

} 

Wenn ich den Code erhalte ich die folgende laufen:

[11, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97] 

Warum erhalte ich falsch ausgegeben? der Ausgang sollte so sein:

2, 3, 4, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 
83, 89, 97 
false 

Was mache ich falsch?

Danke

+1

Ihr Algorithmus ist falsch 'i% 2 = 0 && i% 3 = 0 && i% 5 = 0 && i% 7 = 0 'ist dumme Art und Weise zu prüfe Primzahlen. – gevorg

+0

was soll ich tun? danke – Joe

+0

Schau dir das an: http://www.mkyong.com/java/how-to-determine-a-prime-number-in-java/ – gevorg

Antwort

2

Ihr Code tut genau das, was Sie ihm vorschreiben. Der Grund, warum es bei 11 beginnt, ist, weil Ihr Prime-Check fehlerhaft ist. Zum Beispiel 2% 2 == 0, also denkt das Programm, dass 2 nicht prim ist. Ähnlich für 3, 5 und 7. So beginnt das Programm mit 11.

Sie könnten dies vermeiden, indem Sie eine genauere Primzahl-Prüfmethode schreiben, nicht eine, die nur Teilbarkeit von 2, 3, 5 oder 7 überprüft. zum Beispiel:

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

Außerdem bei dem Versuch, die ersten Elemente aus der Liste zu entfernen, entfernte man tatsächlich die ersten und dritte Elemente (seit der dritten, Position 2, zog in die zweiten Position 1). Deshalb wurde 13 in Ihrem Programm entfernt.

Ersetzen Sie list.remove (1) mit list.remove (0) (so haben Sie zwei).

Hoffe, das hilft!

3

Das weil 2, 3, 4, 5, 7 ist nicht Ihr Zustand 2 % 2 == 0, 3 % 3 == 0 treffen und so weiter. Sie können den Zustand zu so etwas wie dies ändern:

if ((i%2!=0 && i%3!=0 && i%5!=0 && i%7!=0) || i == 2 || i == 3 || i == 5 || i == 7){ 
    .... 
} 
3

Ausgabe in Entfernen von der Liste:

list.remove(0); 
    list.remove(1); 

Also, was Sie hier tun, ist das erste Element zu entfernen, die 1 und die dritten entfernen, wurde das zweite nach dem Löschen der erste, die 13 ist

4

Das Problem ist, dass i%2!=0 && i%3!=0 && i%5!=0 && i%7!=0 die fehlenden Zahlen beseitigt, das ist 2,3,5,7, weil die nicht erfüllen.

Außerdem entfernen Sie die ersten beiden Nummern der Liste, um diese Bedingung zu statifizieren, dh 1 und 13. (11 wird nach dem Entfernen von 1 zum Index 0).

Wenn jedoch Ihr Code nur bis zu 120 funktioniert. Danach beginnen nicht-Primzahlen in der Sequenz zu erscheinen. Um alle Primzahlen bis zu n zu berechnen, sollten Sie stattdessen Eratosthene's sieve betrachten.

3

Java8 Version +!!

System.out.println(Integer.toString(2)); 
IntStream.iterate(3, i -> i + 2) 
     .filter(potential -> IntStream.rangeClosed(3, (int)(Math.sqrt(potential))) 
             .allMatch(n -> potential % n != 0)) 
     .forEach(prime -> System.out.println(Integer.toString(prime))); 
+0

Sollten Sie die Iteration bei '2' nicht beginnen? –

Verwandte Themen