Perfekte/Vollkommende Zahlen von 1 bis r
-
Hallo,
ich sollte ein Pogramm schreiben das die perfekten Zahlen von 1 bis r ausgibt.
Das Pogramm kompiliert zwar, gibt aber leider keine Zahlen an
Wo ist denn hier mein Denkfehler#include <stdio.h> #include <stdlib.h> int Perfekte_Zahl(int Zahl){ int n = 1; int summe; for (n; n < Zahl; n++ ){ if(Zahl % n == 0){ summe += n; } if( summe == Zahl){ printf("%d,", Zahl); return(0); } } } int main() { int Eingabe, probe; printf("Pogramm zur Bestimmung aller perfekten Zahlen die kleiner als Ihre Eingabe ist. \n"); printf("Bitte geben sie eine ganze positive Zahl ein: \n"); scanf("%d", &Eingabe); if (Eingabe <= 0){ printf("Die Zahl %d ist keine positive ganze Zahl!", Eingabe); } if (Eingabe == 1){ printf("Für 1 gibt es keine kleineren vollkommenden Zahlen"); } if (Eingabe > 1){ printf("Die perfekten Zahlen kleiner als %d lauten: \n", Eingabe); while (Eingabe != 1){ Perfekte_Zahl(Eingabe); Eingabe = Eingabe - 1; } } return 0; }
-
int summe=0;
-
Warum bist du kein Mod mehr?
-
Und es funktionier ! Kaum zu glauben .... ich saß eine ganze Stunde dran
Danke nur jetzt gibt es mir bei der eingabe von 29:
28, 24, 6,
und 24 ist keine vollkommmende zahl, kannst du mir sagen warum?Gruß Nena
-
Die Bedingungen oben in der Funktion sollten doch stimmen oder ?
Ich teste halt ob Zahl durch n ohne rest teilbar ist und addiere am schluss alle teiler auf. Das Pogramm sollte nur Zahlen ausgeben, bei denen die Summe aller Teiler wieder die Zahl ist.
-
Mechanics schrieb:
Warum bist du kein Mod mehr?
Hab andere Vorstellungen, wie man ein Forum leitet.
-
Deine Klammern passen nicht zu der Logik, die du möchtest. Wenn ich deinen Code mal konsistent einrücke, dann sieht das so aus (mit den Klammern, wie du sie derzeit hast):
int Perfekte_Zahl(int Zahl){ int n = 1; int summe = 0; for (n; n < Zahl; n++ ){ if(Zahl % n == 0){ summe += n; } if( summe == Zahl){ printf("%d,", Zahl); return(0); } } }
Siehst du den Fehler? Vielleicht ist es so noch deutlicher:
int Perfekte_Zahl(int Zahl) { int n = 1; int summe = 0; for (n; n < Zahl; n++ ) { if(Zahl % n == 0){ summe += n; } if( summe == Zahl) { printf("%d,", Zahl); return(0); } } }
-
Aywin schrieb:
28, 24, 6,
und 24 ist keine vollkommmende zahl, kannst du mir sagen warum?Auch das.
Achte mal streng drauf, korrekt einzurücken.Je nach IDE musste anders vorgehen.
MSVC: Drück Strg+A und dann Alt+F8
Code-Blocks: Menu/Plugins/SourceCodeFormatter(AStyle)
DevC++: Löschen und andere IDE installierenDann kömmt sowas raus:
#include <stdio.h> #include <stdlib.h> int Perfekte_Zahl(int Zahl) { int n = 1; int summe=0; for(n; n < Zahl; n++) { if(Zahl % n == 0) { summe += n; } if(summe == Zahl) { printf("%d\n", Zahl); return(0); } } } int main() { int Eingabe, probe; printf("Pogramm zur Bestimmung aller perfekten Zahlen die kleiner als Ihre Eingabe ist. \n"); printf("Bitte geben sie eine ganze positive Zahl ein: \n"); scanf("%d", &Eingabe); if(Eingabe <= 0) { printf("Die Zahl %d ist keine positive ganze Zahl!", Eingabe); } if(Eingabe == 1) { printf("Für 1 gibt es keine kleineren vollkommenden Zahlen"); } if(Eingabe > 1) { printf("Die perfekten Zahlen kleiner als %d lauten: \n", Eingabe); while(Eingabe != 1) { Perfekte_Zahl(Eingabe); Eingabe = Eingabe - 1; } } return 0; }
Und nu sollte es Dir auffallen, was an der Funktion nicht knusprig ist.
-
Oh danke, klar eine Klammer zu viel
int Perfekte_Zahl(int Zahl) { int n = 1; int summe = 0; for (n; n < Zahl; n++ ) { if(Zahl % n == 0) summe += n; } if( summe == Zahl){ printf("%d,", Zahl); return(0); } }
Jetzt passt die Ausgabe, danke für eure Hilfe.
-
Jetzt kannst du alle 5 perfekten Zahlen ausgeben, die in einen typischen Integer passen .
Bei solchen Aufgabenstellungen bietet sich auch immer eine Klugscheißerlösung an (aber die echte Lösung in der Hinterhand behalten, damit man dem Lehrer zeigen kann, dass man es auch "richtig" könnte):
printf("Die perfekten Zahlen kleiner als %d lauten: \n", Eingabe); if (Eingabe > 6) puts("6"); if (Eingabe > 28) puts("28"); if (Eingabe > 496) puts("496"); if (Eingabe > 8128) puts("8128"); if (Eingabe > 33550336) puts("33550336");
PS: Oder die "optimierte" Lösung :
if (Eingabe > 6) { puts("6"); if (Eingabe > 28) { puts("28"); if (Eingabe > 496) { puts("496"); if (Eingabe > 8128) { puts("8128"); if (Eingabe > 33550336) puts("33550336"); } } } }