2016-12-22 1 views
-1

Dieses Programm sollte alle Primzahlen bis zu einem int drucken, die Sie eingeben, zum Beispiel:Druck Primzahlen bis N Wert

Enter a Number: 
20 
2 
3 
5 
7 
11 
13 
17 
19 

Ich kann einfach nicht mein Programm arbeiten, ich habe wirklich don‘ Ich weiß, was zu tun ist, also wenn jemand es überprüfen und versuchen könnte, es zu beheben, wäre das sehr dankbar, danke.

import java.util.Scanner; 
public class PrimeGenerator { 
public static void main(String args[]) { 
    Scanner k = new Scanner(System.in); 
    System.out.println("Enter an integer"); 
    int number = k.nextInt(); 
    PrimeGenerator matt = new PrimeGenerator(); 
    System.out.println(matt.nextPrime(number)); 
} 

private int number; 

public PrimeGenerator(int n) { 
number = n; 
} 

public int nextPrime(int number) { 
    for (int i = 1; i <= number; i++) { 
     boolean prime = true; 
     for (int j = 2; j < i; j++) { 
      if (i % j == 0) { 
       prime = false; 
      } 
     } 
     if (prime){ 
      return i; 
     } 
    } 
    } 
} 
+1

Bitte geben Sie eine [MCVE]; Was genau funktioniert nicht? – jonrsharpe

+0

Ja, es ist nicht klar, was nicht funktioniert. Error? Ausnahme? Falsche Ausgabe? – csmckelvey

+0

Bitte entfernen Sie das JavaScript-Tag – chester

Antwort

2

Sie sind schon da. Sie haben gerade einen Fehler im Programmablauf.

for (int i = 1; i <= number; i++) { 
    boolean prime = true; 
    for (int j = 2; j < i; j++) { 
     if (i % j == 0) { 
      prime = false; 
     } 
    } 
    if (prime){ 
     return i; //<-- this return will terminate nextPrim 
    } 
} 

Dinge zu beheben/verbessern:

  • nextPrim würde einen Wert innerhalb jeder möglichen Programm-Filiale zurückgeben müssen. Das bedeutet: Betrachten Sie den Fall, in dem nextPrim keine Zahl im angegebenen Bereich findet und aus der Schleife austritt. Jetzt würde das Programm ohne irgendeinen Rückgabewert stecken bleiben.
  • Anstatt die erste gefundene Prim-Nummer zurückzugeben, können Sie die gefundene Prim-Nummer drucken und den Generator am Laufen halten. Schön, einfach und löst den Ärger mit der Rücksendung von irgendetwas, da Sie jetzt nextPrim einfach als void deklarieren können. Ich würde empfehlen, es in printPrims oder etwas ähnliches umzubenennen, um diese Änderung klar zu machen.
  • Übergeben number: Sie können ein wenig Aufwand sparen, indem Sie nur number einmal an den Prim-Generator übergeben. Die einfachste Lösung wäre, sie an nextPrim/printPrims zu übergeben. Jetzt können Sie die Instanzvariable number und den Konstruktor entfernen, der das Problem mit der Signatur des Konstruktors löst.
  • 1 ist keine Primzahl, um pedantisch zu sein. Lassen Sie uns also pedantisch sein und starten Sie die äußere Schleife in printPrims mit 2, so dass 2 die erste Zahl ist, die als prim geprüft wird.

Also lassen Sie uns dies in Code setzen:

import java.util.Scanner; 

public class PrimeGenerator { 
    public static void main(String args[]) { 
     Scanner k = new Scanner(System.in); 
     System.out.println("Enter an integer"); 
     int number = k.nextInt(); 
     PrimeGenerator matt = new PrimeGenerator(); 
     matt.printPrims(number); 
    } 

    public void printPrime(int number) { 
     for (int i = 2; i <= number; i++) { 
      boolean prime = true; 
      for (int j = 2; j < i; j++) { 
       if (i % j == 0) { 
        prime = false; 
      } 
     } 
     if (prime){ 
      System.out.println(i); 
     } 
    } 
} 

Ein paar allgemeine Hinweise:

  • Arbeit durch Compiler-Fehler. Sie sagen Ihnen genau, wo und welche Fehler in Ihrem Code auftreten.
  • Denken Sie über den Ablauf Ihres Programms nach, bevor Sie es implementieren.
  • Teilen Sie die Aufgabe in kleinere Aufgaben auf und implementieren Sie diese nacheinander. Als Beispiel: Für dieses Problem zuerst alle Zahlen im Bereich 2, number ausdrucken. Gehen Sie danach einen Schritt weiter und fügen Sie Funktionen hinzu, um Primzahlen herauszufiltern. Jetzt haben Sie zwei Komponenten, die Sie unabhängig voneinander testen können.
0

Sie waren fast da, aber Ihre nextPrimes Funktion vorzeitig wurde beendet, wenn Sie i zurück, versuchen, etwas wie folgt aus:

import java.util.Scanner; 

class Main { 
    public static void main(String[] args) { 
    Scanner k = new Scanner(System.in); 
    System.out.print("Enter an integer:"); 
    int number = k.nextInt(); 
    printPrimesUptoN(number); 
    } 

    public static void printPrimesUptoN(int n){ 
    for(int i=2;i<n;i++){ 
     boolean isPrime = true; 
     for(int j=2;j<i;j++){ 
     if(i % j == 0){ 
      isPrime = false; 
      break; 
     } 
     } 
     if(isPrime) 
     System.out.println(i); 
    } 
    } 
} 

Probieren Sie es here!

0

Es gibt ein paar Probleme mit dem Code, vielleicht wir können es zusammen reparieren.Zunächst einmal fehlt eine return-Anweisung in nextPrime und es gibt keinen leeren Standardkonstruktor PrimeGenerator(), da Sie einen Konstruktor mit nur einem Argon erstellt haben. Versuchen Sie folgendes:

public class PrimeGenerator { 
    public static void main(String args[]) { 
     Scanner k = new Scanner(System.in); 
     System.out.println("Enter an integer"); 
     int number = k.nextInt(); 
     // you probably want to pass your maximum value to the constructor 
     PrimeGenerator matt = new PrimeGenerator(number); 
     // without a loop of some sort this will only print a single prime number, e.g. 
     // Enter a Number: 
     // 20 
     // 2 
     System.out.println(matt.nextPrime(number)); 
    } 

    private int number; 

    public PrimeGenerator(int n) { 
     this.number = n; 
    } 

    // you're using the argument as upper boundary for your prime detection while not increasing your lower boundary 
    // also you're checking if i is a prime here which you always start at 1. this should always return the same value because once you find a prime number you return 
    // you should consider using an algorithm like Sieve of Eratosthenes (or advanced verions thereof) to determine if a given number is prime 
    public int nextPrime(int number) { 
     for (int i = 1; i <= number; i++) { 
      boolean prime = true; 

      for (int j = 2; j < i; j++) { 
       if (i % j == 0) { 
        prime = false; 
       } 
      } 

      if (prime){ 
       return i; 
      } 
     } 

     // you need to return something at the end of this method or throw an exception 
     throw new IllegalStateException("no more prime numbers available!"); 
    } 
} 

Dies ist keine Lösung, die die Ergebnisse liefern werden Sie erwarten sind, aber es wird zumindest kompilieren. Von diesem Punkt können Sie vorwärts gehen und die algorithmischen Probleme beheben.

0

Ihre ursprüngliche Fehler war in

PrimeGenerator matt = new PrimeGenerator(); 

Fehler:.

PrimeGenerator.java:7: error: constructor PrimeGenerator in class PrimeGenerator cannot be applied to given types; 
    PrimeGenerator matt = new PrimeGenerator(); 
         ^
    required: int 
    found: no arguments 
    reason: actual and formal argument lists differ in length 
1 error 

Beachten Sie, dass Sie, wie Sie Klasse eine Methode mit dem gleichen Namen hatte, aber ich glaube nicht, dass Sie es wurden unter Verwendung von als Konstrukteur und wenn du es warst, hat es einen Int genommen, den du nicht gegeben hast. Ihre Methode auf Linie 13 war:

public PrimeGenerator(int n) { 
number = n; 
} 

Versuchen Sie,

new PrimeGenerator().nextPrime(number); 

Statt

import java.util.Scanner; 

public class PrimeGenerator { 
     public static void main(String args[]) { 
       Scanner k = new Scanner(System.in); 
       System.out.println("Enter an integer"); 
       int number = k.nextInt(); 
       new PrimeGenerator().nextPrime(number); 
     } 

     public void nextPrime(int number) { 
       for (int i = 1; i <= number; i++) { 
         boolean prime = true; 
         for (int j = 2; j < i; j++) { 
           if (i % j == 0) { 
             prime = false; 
           } 
         } 
         if (prime){ 
           System.out.println(i); 
         } 
       } 
     } 
} 

Optional ursprünglichen Konstruktor zu verwenden, können Sie dies heraus trennen konnte.

import java.util.Scanner; 

public class PrimeGenerator { 

     private int number; 

     public static void main(String args[]) { 
       Scanner k = new Scanner(System.in); 
       System.out.println("Enter an integer"); 
       int number = k.nextInt(); 
       // Initialize with a number. 
       PrimeGenerator pg = new PrimeGenerator(number); 
       pg.printPrimes(); 
     } 

     // This is the constructer you were misusing. 
     public PrimeGenerator(int n) { 
       number = n; 
     } 

     public void printPrimes() { 
       // Actually use your private number variable. 
       for (int i = 1; i <= number; i++) { 
         boolean prime = true; 
         for (int j = 2; j < i; j++) { 
           if (i % j == 0) { 
             prime = false; 
           } 
         } 
         if (prime){ 
           System.out.println(i); 
         } 
       } 
     } 
} 
0

Es gibt mehrere Probleme:

  1. Sind Sie ein IDE? Wenn ja, was ist es, sonst Warum nicht? Wenn Sie sich selbst für einen Anfänger halten, sollten Sie einen wie Eclipse IDE oder NetBeans IDE verwenden.
  2. In Bezug auf Ihren Algorithmus gibt es auf den ersten Blick eine Kompilierung und eine Logik Probleme.
  3. Compilation Problem ist, wenn die Ausführung Ihrer Klasse nicht funktioniert. In diesem Fall MUSS die Methode nextPrime(int number) eine int zurückgeben. Obwohl Sie eine Rückgabeklausel angeben, gibt die Methode keinen Wert zurück, wenn prime false ist. Sie können dieses Problem leicht mit einer IDE erkennen.
  4. Ein weiteres Kompilierungsproblem, der Sentinel oder die Variable i ist innerhalb der For-Schleife, und Sie drucken seinen Wert außerhalb von ihm. Noch einmal, die IDE würde Ihnen bei diesem Problem helfen.
  5. Logic Problem ist, Sie einen Wert zurückgeben, wenn und nur wenn das Flag prime wahr ist, so ist, wenn die Methode aufgerufen wird (unter der Annahme arbeitet) Sie nur einen Wert erhalten, wenn Sie System.out.println(matt.nextPrime(number)); rufen

die korrekte Implementierung würde diese Überlegungen haben:

  1. Verfahren nicht zurück, das heißt public void nextPrime(number) { ..., was bedeutet, dass Sie nicht über Druck in der Hauptmethode benötigen, nur um es nennen.
  2. Die Methode druckt tatsächlich die Zahlen.
  3. Auf diese Weise können Sie prüfen, ob i % j von Null verschieden ist, dann müssen Sie nicht mehr Teiler verarbeiten, die for Schleife zu brechen.
  4. Drucken Sie es.
  5. Das ist es.

    public static void main(String [] args) { 
        . 
        . 
        . 
        PrimeGenerator matt = new PrimeGenerator(); 
        matt.nextPrime(number); 
    } 
    
    public void printPrime(int number) { 
        boolean prime = true; 
        for (int i = 2; i <= number; i++) { 
         prime = true; 
         for (int j = 2; j < i; j++) { 
          if (i % j != 0) { 
           prime = false; 
           break; 
          } 
         } 
         if (prime) { 
          System.out.println(i); 
         } 
        } 
    }