2 Fragen zur Ulamfolge



  • Hallo

    leider komme ich bei folgender Aufgabe nicht weiter und hoffe ihr könnt mir da helfen:

    Aufgabe 4.
    a)
    Definieren Sie eine Funktion USZ, die für eine eingegebene natürliche Zahl u > 0 die Anzahl der Glieder der Ulamfolge zählt (bis (einschließlich!) zum ersten Auftreten der Eins) und diese Anzahl zurückgibt.
    Beispiel: USZ(3) = 8, weil hier die Ulamfolge (3, 10, 5, 16, 8, 4, 2, 1) aus 8 Gliedern besteht.
    b)
    Verwenden Sie diese Funktion USZ in einem C++-Programm, das nach Eingabe einer natürlichen Zahl BereichsEnde für alle Zahlen AnfZ von 1 bis BereichsEnde die Ulamschrittzahl ermittelt und die größte dieser Schrittzahlen (MaxSZ) sowie die zugehörige Anfangszahl AnfZ ausgibt, bei der die maximale Schrittzahl erstmalig erreicht wurde.
    (Tip: Dieselbe Schrittzahl – und folglich auch die maximale – kann mehrfach auftreten; es gilt offenbar auch USZ(20) = 8.)

    Soweit bin ich bereits gekommen - ich weiß aber nicht, wie ich jetzt Teil b umsetzen soll:

    # include <iostream.h>
    
    int USZ(int f_u)
    {
    	int schritt;
    	schritt = 1;
    
    	while (f_u != 1)
    	{	
    		if (f_u % 2 == 0) 
    		{
    			f_u = f_u/2;
    		}
    		else 
    		{
    			f_u = 3 * f_u + 1;
    		}
    		schritt++;
    		}
    	return schritt;
    }
    
    void main()
    {
    	int u;
    
    	cout << "Eine natuerliche Zahl > 0 eingeben: ";
    	cin >> u;
    	cout << "Anzahl der Glieder der Ulamfolge: " << USZ(u) << endl;
    }
    

    Und dann hätte ich da noch eine zweite Frage: wie sieht die rekursive Funktion der Ulamfolge aus?

    Vielen Dank schon mal für eure Antworten
    Gruß
    Keine_Ahnung



  • int main()
    {
     int BereichsEnde;
     cin >> BereichsEnde;
     int MaxSZ = -1;
     int AnfZ= 0;
     for(int i = 1; i <= BereichsEnde; i++)
     {
        int SZ = USZ(i);
        cout << SZ << endl;
        if(SZ > MaxSZ)
        {
           MaxSZ = SZ;
           Anfz = i;
        }
     }
     cout << Anfz << endl;
     cout << MaxSZ << endl;
    }
    

    Und dann hätte ich da noch eine zweite Frage: wie sieht die rekursive Funktion der Ulamfolge aus?

    int USZ(int f_u)
    {
      if(f_u == 1)
        return 1;
      if(f_u % 2 == 0)
        return USZ(f_u / 2)+1;
      else
        return USZ(3 * f_u + 1)+1;
    }
    


  • size_t usz(size_t n){return 1+(n>1?usz(n&1?3*n+1:n/2):0);}



  • Windalf schrieb:

    size_t usz(size_t n){return 1+(n>1?usz(n&1?3*n+1:n/2):0);}

    Ist das die besonders gut lesbare Fassung 🙄 :p


Anmelden zum Antworten