Fröhliche Zahl mittels do-while Schleife



  • Hallo,

    ich habe hier eine Aufgabe mittels do-while Schleife zu einer positiven Zahl C alle fröhlichen Zahlen <= C durch ein programm ausgeben zu lassen.

    Nun meine Frage: wie programmiere ich soetwas?

    Mein Problem ist folgendes: ich weiss nicht, wie z.B. von der Zahl 19 die einzelnen Ziffern nehmen soll und die quadrieren d.h. wie folgendes:

    19-> 12+92 = 82-> 82+22 = 68-> 62+82 = 100 -> 12+02+0^2=1

    wie kriege ich diese rechenweise in c hin?

    mein problem ist wiegesagt: wie ich von einer zahl die ziffern absplitten soll und zum quadrat addieren soll...

    kann mir da jemand einen tipp geben?



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



  • was bedeuten denn beide zeilen?

    ich meine was bedeutet s+=

    und das x/=10?

    irgendwie konnte ich nirgends in meinen unterlagen was zu finden.



  • achja und wenn ich folgendes kompiliere und ausführe; gibt er mir 16 aus.
    nicht wie gefordert alle positive zahlen kleiner gleich x.

    #include<stdio.h>
    
    int main()
    
    {
        int s,x;
    
    x=19;    
    
        do {
    
    s+=((x%10)^2); 
    
    }
    while(x/=10); 
    
    printf("%d\n "s);
    
    return 0;
    }
    

    wo liegt denn der fehler? :-S



  • Togglino schrieb:

    wo liegt denn der fehler? :-S

    Zweierlei. Die Aufgabenstellung hast Du nicht vollständig abgetippt, und ich weiß nicht, was fröhliche Zahlen sind. Und im Code habe ich eine Falle eingebaut, die dafür sorgen kann, daß Du irgend ein Script oder C-Buch mal überfliegen mußt, um damit was anfangen zu können.



  • also bin jetzt soweit:

    #include<stdio.h>
    #include<math.h>
    
    int main()
    
    {
        int s,x;
    
    x=19;     
    
    do
    s=+pow((x%10),2);
    
    while(x/=10);
    
    printf("%d\n",s);
    
    getchar();
    return 0; 
    }
    

    wie mache ich das denn, dass er die zwischen ergebnisse darstellt? also
    82,68 und 100?

    also eine föhliche zahl nennt man eine zahl die bei obig genannten verfahren immer auf 1 endet-



  • achja und die aufgabe lautet:

    schreibe ein programm, dass zu einer vorgegebener zahl C alle fröhlichen zahlen <=C berechnet und ausgibt.

    das heisst alle zahlen die inform von 1 enden, wie mein erster post es beschreibt.



  • Verfahren nach Sieb des Euler und mit do/while Schleife, deren Ablauf du mittlerweile verstanden haben solltest:

    void froehlich(size_t bis)
    {
      int i,j,k=2,weiter,start;
      char *a=calloc(1,bis/2+2);
      do {
        weiter=0;start=0;
    
        for(i=k;i<=bis/2;++i)
          if(!a[i])
            {k=i+1;start=i*2-1;break;}
    
        if(start)
          for(i=1,j=0;j+=!a[i],i<=bis/2;++i)
            if(!(j%start))
              weiter=1,a[i]=1;
    
      } while(weiter);
    
      for(i=1;(i-1)*2+1<=bis;++i)
        if(!a[i])
          printf("\n%d",(i-1)*2+1);
      free(a);
    }
    
    int main()
    {
        froehlich(19);
        return 0;
    }
    


  • volkard schrieb:

    und ich weiß nicht, was fröhliche Zahlen sind

    Bis grad eben wusste ich es auch nicht, um so amüsanter der Artikel. Es gibt
    auch traurige Zahlen.

    Besonders hervorzuheben: 👍

    wikipedia schrieb:

    Primzahlen, die fröhlich sind, nennt man fröhliche Primzahlen

    http://de.wikipedia.org/wiki/Fröhliche_Zahl



  • 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).


Log in to reply