Fröhliche Zahl mittels do-while Schleife



  • gibt es da keinen anderen ansatz?

    die aufgabe muss ohne eine funktion gelöst werden.

    das heisst nur durch int main().
    und mit while do.



  • Hiho,

    ich muss dieselbe Aufgabe machen und bin soweit, dass ich den erste Teil, ob die Zahl eine fröhliche ist, berechnen kann.

    do
       {
    
         x1=y;
         x1=(x1/10)*(x1/10);  /*Die 1 zum Quadrat */
    
         x2=y;   
         x2=(x2%10)*(x2%10); /*Die 9 zum Quadrat */
    
         y=x1+x2;
       }  
    while ();
    

    y hab ich erstmal mit 19 initialisiert, um zu sehen ob es klappt. Mein Problem ist jetzt, die Formulierung der while Bedingung. Wenn das Ergebnis von y != 1 muss die Schleife wieder von vorne anfangen, aber das tut sie nicht. T_T
    Zumindest nicht wenn ich es so eingebe: while (y!=1); Ich krieg immer nur eine Endlosschleife.

    Da wir noch keine weiteren Funktionen gelernt haben und auch math.h eigentlich noch nicht kennen, habe ich den Quellcode soweit auch ohne diese geschrieben.

    Jetzt komm ich nicht weiter, mir fällt einfach nicht ein, was ich da als Bedingung schreiben soll. Hat nicht irgendwer ne Idee und kann helfen?



  • Die Zwischenergebnisse können auch mehr als nur 2 Stellen haben. Bei y=100 hängt sich die Schleife auf, weil x1 nicht richtig berechnet wird.

    EDIT: Debugger nutzen und schrittweise durchgehen, dann sieht man es sofort.



  • wie kriegt man denn diese schleife für zahlen, die auch zum beispiel die 100 umfassen hin?



  • Jetzt bin ihc noch mehr verwirrt...U.U

    Ok an 3stellige Zahlen hab ich gar nicht gedacht. Aber wie soll man das denn auch noch berücksichtigen? Noch eine Zeile mit x3 usw. machen?

    Ist denn das was ich bisher geschrieben habe, zumindest die do-while Schleife, soweit schon richtig? oder bin ich ganz auf den Holzweg?



  • hey ich hatte mir folgendes für zahlen die dreistellig sind oder höher sind gedacht:

    do
    
    {
    
    if(z>=1)
    z=(x/10)*(x/10);
    else
    y=(x%10)*(x%10);
    
    x=y+z;
    
    printf("%d\n",x);
    
    }
    
    while(x!=1);
    

    aber es funktioniert nicht! brauche hilfe!

    @ Kisu, ich denke der ansatz ist schon richtig, hab ihn ja auch so.



  • volkard schrieb:

    do
    s+=(x%10)²
    while(x/=10)

    Dieser Ausdruck und noch ein paar Zeilen Code drumherum(so um die 4 bis 6 Zeilen ohne Ausgabe) basteln und ihr seid fertig. Dafür müsst ihr aber erstmal verstehen was da steht. Als Tipp noch: schleifen lassen sich schachteln.

    EDIT: s+=x ist das Gleiche wie s=s+x. Genauso für -=, /=, *=, ...



  • Ich versteh nicht ganz die while Bedingung. Das x/=10 heißt doch dasselbe wie x=x/10 oder?

    Wenn es so ist, dann versteh ich nicht, wie man mit der Bedingung die Schleife so beenden soll, dass sie entweder bei 1 (Fröhliche Zahl) oder bei 42 (Traurige Zahl) aufhört.

    Verschachtelte Schleifen müssen wir doch aufjedenfall glaub ich benutzen, weil wir eine brauchen um zu prüfen ob die Zahl eine Fröhliche Zahl ist und eine zweite, welche dann die geprüfte Zahl ausgibt und dann die Zahl um ein erhöht. In dieser wird ja dann wieder in die erste Schleife leitet wo die Zahl geprüft wird.

    Also so in etwa:

    Do
    {
       Do
        /*Zahl prüfen ob Fröhlich oder Traurig*/
       while()
    
    printf (..);
    x++;
    }
    while()
    

    Das sind doch schon verschachtelte oder? Oder meinst du, dass da noch eine rein muss?

    Ich glaub ich bin zu doof dazu...T___T



  • Ich weiß nicht, wie du auf 42 kommst. 42 -> 20 -> 4 muss man ja weiter aufteilen.

    unsigned int f(unsigned int i)
    {
    	unsigned int s;
    	do {
    		s=0; // nicht vergessen
    		do {
    			s+=(i%10)*(i%10);
    		} while (i/=10);
    		i = s;
    	}while(i>9);
    	return i;
    }
    

    Kisu schrieb:

    Ich versteh nicht ganz die while Bedingung. Das x/=10 heißt doch dasselbe wie x=x/10 oder?

    JaykopX schrieb:

    s+=x ist das Gleiche wie s=s+x. Genauso für -=, /=, *=, ...



  • Das mit der 42 steht in der Aufgabe drinn. Eine Zahl ist entweder fröhlich oder traurig. Eine fröhliche Zahl erreicht ja immer irgendwann die 1.Wenn eine Zahl die 42 erreicht: 42->20->4->16->37->58->89->145->42 ... ist sie eine traurige Zahl weil sie nie die 1 erreicht.

    und wegen dem x/=10, da wollt ich nur noch ma ne bestätigung ob ich das richtig verstanden hab.

    Bei deinem Code verstehe ich schon die erste Zeile nicht :S Ein un int f (un int i) ? Das hatte ich noch nicht (das mit der klammer). Ich wollt mich schon daran halten das so zu machen mit den mitteln die uns sozusagen gegeben worden sind.

    U.U ich glaub das wird bis morgen nicht mehr, bin schon seit ner Woche da dran..



  • Normalerweise rechnent man bis zur kleinsten Zahl runter, die einen geschlossenen Zyklus beginnt und das ist 4 und nicht 42.
    Man kann natürlich auch jede beliebige andere Zahl aus der Folge 4->16->37->58->89->145->42->20 nehmen.

    Vicious Falcon hat schon den ganzen logischen Teil geliefert. Das in die main() umzuschreiben sollte kein Ding mehr sein.

    Erklärungen zur inneren Schleife:
    x%10 liefert dir immer die Einerstelle einer Zahl. (9876%10=6)
    x/10 entfernt immer die Einerstelle einer Zahl, da bei einer integer-division auf die nächst kleinere, ganze Zahl abgerundet wird. (9876/10=987)

    Das kannst du dir ja an weiteren Beispielen klar machen und dann nachvollziehen was die innere Schleife denn (logisch) macht.

    Das while(i>9), kann man auch schreiben als while(i!=1 && i!=4).



  • Das ist eine ganz normale Funktion. main() benutzt du ja auch.

    int main()
    {
      unsigned int i = f(19); // Aufruf der eigenen Funktion
      if(i==1)
        puts("19 ist eine froehliche Primzahl"); // auch ein Funktionsaufruf
      printf("100: %d",f(100));  // hier auch
      return 0;
    }
    

    Was ich meinte war, dass 42 noch weiter aufgeteilt wird.

    4->16->37->58->89->145->42->20->4
    7->49->97->130->10->1
    91->82->68->100->1
    9986->262->44->32->13->10->1
    

    Btw. Von fröhlichen Zahlen habe ich vorher noch nie gehört, was es alles gibt 😃



  • JaykopX schrieb:

    Das while(i>9), kann man auch schreiben als while(i!=1 && i!=4).

    Ja, denn die 7 ist auch fröhlich. Das könnte sonst verwirrend sein.
    Oder while(i!=1 && i!=42).
    Man könnte while(i>4) machen.



  • Gehört nicht mehr zur Aufgabe, aber interssiert mich:

    Konstruiere einen Algorithmus der eine fröhliche Zahl liefert.
    Dabei soll die Folge n Mitglieder haben und die fröhliche Zahl möglichst klein sein. 😃



  • Man könnte doch noch einen Zeiger an f übergeben, in jedem Schleifendurchgang wird er dereferenziert und erhöht.

    int r, n = 5;
    
    while(1)
    {
    	nf = 0; // an f übergeben
    	if((r=f(i,&nf))==1)
    	{
    		if(nf==n)
    		{
                // gefunden
    			break;
    		}
    	}
    	++i;
    }
    
    für n = [1,7[
    1      13
    2      23
    3      44
    4      70
    5      356
    6      78999
    oh, n ist verrutscht
    


  • Das sieht sehr nach Brute Force aus.
    Einfach alle Zahlen durchprobieren...

    Ich hatte da eher sowas im Kopf:
    Fange mit 1 an, berechne daraus 10, berechne daraus 13, berechne daraus 32, usw...

    bis man n Schritte hinter sich hat.

    Ich denke dein Vorschlag wird schon für "kleine" n eine Ewigkeit dauern, weil die Folgenmitglieder mit wachsender Folgenlänge schnell sehr groß werden, dementsprechend wird dann auch die fröhliche Zahl schnell sehr groß.
    Kann aber auch sein, dass ich grad einen Denkfehler hab.

    Hast du es mal getestet?



  • JaykopX schrieb:

    Ich denke dein Vorschlag wird schon für "kleine" n eine Ewigkeit dauern, weil die Folgenmitglieder mit wachsender Folgenlänge schnell sehr groß werden, dementsprechend wird dann auch die fröhliche Zahl schnell sehr groß.

    n länge
    10 1
    13 2
    23 3
    19 4
    7 5
    356 6
    Ab hier gehts los mit Gemeinheit.
    Wir suchen eine Zahl, deren Sumem der Quadrate der Ziffern >356 ist. Die kleinstmögliche hätte lauter Neunen oder wenigsten große Ziffern. Pro Ziffer maximal 81 als Summenbeitrag. 356/81=4,39. Minstestens 5 Stellen sind nötig für die nächste Zahl.
    Sie wurde gefunden bei
    78999 7
    Wir suchen jetzt eine Zahl, deren Sumem der Quadrate der Ziffern >78999 ist. Die kleinstmögliche hätte lauter Neunen oder wenigsten große Ziffern. Pro Ziffer maximal 81 als Summenbeitrag. 78999/81=975,27 Stellen. Minstestens 976 Stellen sind nötig für die nächste Zahl.



  • Die Zahl hat in Wirklichkeit 977 Ziffern und lautet $$3788\overbrace{999\ldots 9}^{973}$$



  • Sorry dass ich euch schon wieder nerve, aber ich checks immernoch nicht...
    es funktioniert auch nicht.

    Hab jetzt das benutzt was Vicious Falcon gepostet hat. Hab hin und her geschoben, hier was veränder da was dazu geschrieben .. es so gelassen...alle probiert...aber das Programm gibt nie aus ob es ne fröhliche Zahl ist, ob nicht..oder überhaupt ...

    Ich versteh den Code auch net wirklich, was da mit der Einerstelle gemacht versteh ich. Aber warum da noch +s ist keine Ahnung.

    do { 
            s=0; 
            do { 
                s= s+(x%10)*(x%10); /*Einerstelle*/
            } while (x/=10);     /* Zehnerstelle*/
            x = s; 
        }while(x!=1 && x!= 4);
    
        printf("x ist eine Fröhliche Zahl: %d \n",x);
    

    So sieht meiner jetzt aus..
    Ich krieg immer entweder ne Endlosschleife..falsche Zahlen..oder gar nichts. und wenns dann ma für die 1 was richtiges ausgibt, gibt er für die 2 was falsches aus.. usw...
    Ich bin echt am verzweifeln... 😞



  • happy coder schrieb:

    Die Zahl hat in Wirklichkeit 977 Ziffern und lautet $$3788\overbrace{999\ldots 9}^{973}$$

    Das erscheint mir nicht sehr wahrscheinlich. Quelle?


Anmelden zum Antworten