Problem bei Armstrong-Zahlen



  • Hallo!
    Ich habe ein C-Programm zur Berechnung von Armstrong-Zahlen geschrieben. In dieser Form funktioniert auch alles einwandfrei:

    #include <stdio.h>
    #include <math.h>
    
    int main () {
    
    	int z=1;
    
    	while (z<=10000) {
    	armstrong(z);
    	z++;
    	}
    }
    int laenge (int z) {
    
    	int s=0;
    	while (z>0) {
    	z=(z/10);
    	s=s+1;
    	}
    	return s;
    }
    
    int armstrong(int z, int k) {
    
    	int lz=0;
    	int hochzahl=0;
    	int summe=0;
    	int zz=z;
    	int s=0;
    
    	s=laenge(z);
    
    	while (z>0) {
    	lz=z-10*floor(z/10);
    	hochzahl=pow(lz,s);
    	summe=summe+hochzahl;
    
    	z=floor(z/10);
    	}
    	if (summe==zz)
    		printf("%4d ist eine Armstrong-Zahl\n",zz);
    	return 0;
    }
    

    Für die Aufgabe muss ich es jedoch umschreiben, und in dieser Form gibt es mir irgendwelche komische Zahlen aus:

    #include <stdio.h>
    #include <math.h>
    
    int main () {
    
    	int z=1;
    
    	while (z<=10000) {
    	printf("%4d ist eine Armstrong-Zahl\n",armstrong(z));
    
    	z++;
    	}
    }
    int laenge (int z) {
    
    	int s=0;
    	while (z>0) {
    	z=(z/10);
    	s=s+1;
    	}
    	return s;
    }
    
    int armstrong(int z, int k) {
    
    	int lz=0;
    	int hochzahl=0;
    	int summe=0;
    	int zz=z;
    	int s=0;
    
    	s=laenge(z);
    
    	while (z>0) {
    	lz=z-10*(z/10);
    	hochzahl=pow(lz,s);
    	summe=summe+hochzahl;
    
    	z=floor(z/10);
    	}
    
    	if (summe==zz)
    	return zz;
    
    }
    

    Ich habe keine Ahnung, warum! Kann mir vielleicht jemand helfen?
    Danke im voraus!



  • Was ich noch sagen sollte: Beim zweiten Code in Zeile 43 setzt er anscheinend Zahlen gleich, die nicht gleich sind. Also wenn zz=13 ist und summe=1 sagt er "ja, is gleich". Das is das was mir kopfzerbrechen bereitet.



  • Irgendwie fehlt dein else. Das sollte auch der Compiler bemeckern und sowas wie "Warning: reaching end of non-void function" ausgeben.

    In deiner alten Zeile 43 gibst du entweder die Armstrong-Zahl zurück oder 0 wenn es keine Armstong-Zahl ist.
    In deiner neuen Version gibst du die Armstrong-Zahl zurück oder irgendwas pseudo-zufälliges was gerade auf dem Stack liegt wenn es keine gibt. Pack wie in der alten Version ein return 0 in Zeile 45 und es sollte gehen.



  • k.dannehl schrieb:

    Für die Aufgabe muss ich es jedoch umschreiben...

    wie lautet denn die aufgabe? was iss'n eine 'armstrong-zahl'?
    🙂



  • http://www.igtfy.com/?q=armstrong+zahlen
    Ich liebe diesen Link.
    http://de.wikipedia.org/wiki/Narzisstische_Zahl
    Was es nicht alles für Zahlen gibt. Wilde narzisstische Zahlen, interessante Zahlen, fröhliche Zahlen, glückliche Zahlen...
    Wenn ich mal groß bin werde ich auch eine glückliche Zahl.



  • nwp2 schrieb:

    http://www.igtfy.com/?q=armstrong+zahlen
    Ich liebe diesen Link.

    geht bei mir nicht: Enable javascript to use this site

    nwp2 schrieb:

    Wenn ich mal groß bin werde ich auch eine glückliche Zahl.

    und wenn ich gross bin, werde ich das +∞ das +1 -∞ ergibt. *fg*
    🙂



  • Die Aufgabe lautet:
    Schreiben Sie ein Hauptprogramm, das alle Armstrong-Zahlen von 1 bis 10000 bestimmt. Rufen Sie dazu die Funktion Armstrong auf.

    Ich denk mal dass die das printf nicht in der Funktion haben wollen sondern im HP.

    nwp2:
    Wenn ich da ein "else return 0" hinschreib gibt er mir bei jeder Zahl die keine Armstrong-Zahl ist, eine 0 aus, er soll aber nur die Zahlen ausgeben die welche sind.
    Auf jeden Fall schonmal Danke für die Bemühungen!

    PS: Ich will ein endlicher Bruch von 1/3 werden...



  • Dann fang die 0 doch ab. Zeile 9ff:

    while (z<=10000){
        if (armstrong(z)) printf("%4d ist eine Armstrong-Zahl\n", z);
        z++;
    }
    

    Mir fällt gerade auf dass deine Funktion armstrong zwei ints als Parameter verlangt, du ihr aber nur ein int gibst. Das bedeutet im zweiten Parameter steht Blödsinn. Überlege dir nochmal genau was die Funktion genau mit welchen Parametern tun soll um was zurückzugeben.



  • Super, jetzt funktioniert es so wie es soll, vielen Dank!
    Und das mit dem int k hab ich schon rausgenommen, ist mir auch schon aufgefallen.

    Schönen Abend noch!


Anmelden zum Antworten