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.


  • Mod

    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 installieren

    Dann 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. 🙂


  • Mod

    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");
                      }
                  }
              }
          }
    

Anmelden zum Antworten