2017-04-09 3 views
1

Ich bin ziemlich neu in der Codierung und ich studiere C. Mein Klassenlehrer gab eine Aufgabe des Schreibens eines Programms, das uns sagen wird, welche ganzen Zahlen sind "perfekte Zahlen" (Zahlen, in denen die Faktoren Ohne die Zahl selbst addiert man sich zu der Zahl, zB 6 = 1 + 2 + 3, also ist 6 eine perfekte Zahl.) Ich stehe vor einigen Problemen mit dem Code, den ich geschrieben habe, und hoffe, einen Rat zu bekommen.Perfekte Zahlen mit einem C-Programm finden

#include <stdio.h> 

int main(void) { 
    int number, counter, sum; 

    sum = 0; 

    printf("For the integers from 1 to 1000:\n"); 

    for (number = 1; number <= 1000; number++) { 
     counter = 1; 
     while (counter <= number - 1) { 
      if ((number - 1) % counter == 0) { 
       sum += counter; 
      } 
     } 
     if (sum == number) { 
      printf("%d is a perfect number.\n", number); 
     } 
    } 

    return 0; 
} 

Dies ist der Code, den ich geschrieben habe. Das Problem, mit dem ich konfrontiert bin, ist, dass wenn ich das Programm ausführe, es nur "Für die Ganzzahlen von 1 bis 1000:" druckt und dann stoppt es. Das Programm endet nicht oder so.

Abgesehen von dem Problem, das ich erwähnt habe, sind alle Ratschläge oder Vorschläge sehr willkommen.

Vielen Dank!

+2

Ihre 'while' Schleife ist unendlich, wenn sie eingegeben wird. –

+1

'if ((number - 1)% counter == 0) {' das gibt dir die perfekte Zahl für 'number-1'. Ersetzen Sie es durch 'if ((number)% counter == 0) {'. – AntonH

+0

Weder 'number' noch' counter', die einzigen beiden Varianten Ihrer while-Bedingung, werden innerhalb Ihrer while-Schleife geändert. Sobald du drin bist, bist du permanent dabei. * Etwas * muss sich ändern. – WhozCraig

Antwort

3

Der Grund, warum Ihr Programm nicht beendet wird, ist, dass Sie eine unendliche While-Schleife haben. counter wird immer kleiner als number - 1 sein, da keiner von beiden innerhalb der Schleife geändert wird. Einige IDEs geben Ihnen dafür eine Syntax-Highlighting-Style-Warnung. Um dies zu beheben, einen Zuwachs für Ihren Zähler hinzu:

while (counter <= number - 1) { 
    if ((number - 1) % counter == 0) { 
     sum += counter; 
    }   
    counter++; 
} 

Als Nebenwirkung haben Sie auch einen Logikfehler (nichts mit der unendlichen while-Schleife zu tun) in if ((number - 1) % counter == 0). Dies überprüft, ob das Dekrement der eingegebenen Nummer perfekt ist oder nicht. Sie sollten es ändern in if (number % counter == 0)

+0

Ah, ich sehe Sie haben Recht. Vielen Dank für die Ich werde beim nächsten Mal vorsichtiger sein .. – Sean

+0

@ABusyProgrammer Erwägen Sie, [was soll ich tun, wenn jemand meine Frage beantwortet?] (http://stackoverflow.com/help/someone-answers) statt https: // meta .stackoverflow.com/q/287723/2410359 – chux

+0

@Sean Gemäß den StackOverflow-Richtlinien und der Empfehlung von chux [was soll ich tun, wenn jemand meine Frage beantwortet] (http://stackoverflow.com/help/someone-answers), können Sie das tun schätze eine gute Antwort, indem du sie entweder aufhebst oder akzeptierst, wenn sie für dich funktioniert. –

Verwandte Themen