2016-11-21 3 views
1

Hallo das ist das erste Mal, dass ich hier eine Frage stelle, ich lese die Richtlinien und ich habe nach einer Antwort gesucht und keine gefunden, also hoffe ich, dass meine Frage innerhalb der Richtlinien liegt. Jedenfalls stecke ich auf einer einfachen Java-Übung fest, wo ich die ersten N perfekten Zahlen ausgeben muss (In der Zahlentheorie ist eine perfekte Zahl eine positive ganze Zahl, die gleich der Summe ihrer richtigen positiven Teiler ist, dh die Summe ihrer positive Teilern die Zahl selbst (auch als aliquote Summe bekannt) ausgeschlossen ist.) Also habe ich diesePefect Nummer Java

import java.util.Scanner; 

public static void main(String[] args) { 

    Scanner in = new Scanner(System.in); 

    int cont = 0; 
    int num = 1; 
    int soma = 0; 
    System.out.println("Quantos números perfeitos?"); 
    int n = in.nextInt(); 

    while (cont < n) { 
     for (int i = 1; i <= num/2; i++) { 
      if (num % i == 0) { 
       soma = soma + i; 
      } 
     } 

     if (num == soma) { 
      System.out.println(num + " é perfeito."); 
      cont++; 
     } 
     num++; 

    } 
} 

Es in einer Endlosschleife hängen bleibt, und ich kann nicht herausfinden, warum. Wie auch immer, wenn jemand mir helfen kann, würde ich es wirklich schätzen und wenn meine Frage beantwortet wurde oder wenn es nur eine blöde Frage ist, tut mir leid, wie ich schon sagte, es ist meine erste Frage. Vielen Dank.

+1

Willkommen bei Stackoverflow. Wenn Sie eine integrierte Entwicklungsumgebung haben, würde ich vorschlagen, dass Sie Haltepunkte bei mehreren Zeilen setzen, insbesondere Soma = Soma + I und If (Num == Soma). (Wenn Sie keine IDE haben, bitte System.out.println einige wichtige Variablen.) – rajah9

+0

Wahrscheinlich weil 'cont ++' nur inkrementiert wird, wenn es eine perfekte Zahl ist. Die erste nicht perfekte Zahl wird in der Schleife stecken bleiben. Ich denke, die while-Schleife sollte 'while (num AntonH

+0

Nur allgemeine Ratschläge, anstatt einer Antwort, und dies könnte Ihnen offensichtlich offensichtlich sein, aber es ist wahrscheinlich ein Problem, dass die for-Schleife niemals eine Zahl erzeugt, in der 'soma == num' steht. Als solches wird "cont ++" niemals ausgeführt, und daher ist "cont SpencerD

Antwort

6

Ihr Code sieht gut aus - das einzige, was Sie vergessen, ist, den Wert soma jedes Mal in der While-Schleife zurückzusetzen. In Ihrem aktuellen Code, soma ist die Summe der richtigen Faktoren von alle die Zahlen, die Sie bisher durchlaufen, was nicht das ist, was Sie wollen.

Hier ist der Code, den Sie müssten:

Scanner in = new Scanner(System.in); 

int cont = 0; 
int num = 1; 
int soma; 
System.out.println("Quantos números perfeitos?"); 
int n = in.nextInt(); 

while (cont < n) { 
    soma = 0; //Don't forget this line 

    for (int i = 1; i <= num/2; i++) { 
     if (num % i == 0) { 
      soma = soma + i; 
     } 
    } 

    if (num == soma) { 
     System.out.println(num + " é perfeito."); 
     cont++; 
    } 

    num++; 
} 
+2

Ich frage mich, warum dies abgelehnt wurde. Es ist die richtige Antwort. – Andreas

+0

Haben Sie das tatsächlich ausgeführt, um sicherzustellen, dass es die Endlosschleife behebt? Ich denke, du wirst feststellen, dass es andere Fehler gibt (was passiert, wenn num! = Soma) – John3136

+2

Ja, ich habe es getestet, und es scheint zu funktionieren. Ausgabe für n = 3: '6 é perfeito. 28 é perfeito. 496 é perfeito.' – 416E64726577