Potenz in C++



  • oder du kannst einfach ab:=exp(bln(a))a^b := exp( b \cdot ln( a ) ) benutzen. dann brauchst du nur exp() und ln() zu implementieren.



  • Christoph schrieb:

    An welcher Stelle hängst du denn? Sehr viel ausführlicher kann ich kaum werden, ohne den Code explizit aufzuschreiben. Ein wenig musst du auch selber nachdenken.

    Also ich hab

    int my_pow(int base, int exponent)
    {
        // 2*2
      for(int result = 1; result >= exponent; result *= base)
      return result;
    }
    
    int main()
    {
        int base = 2;
        int exponent = 2;
        int sum = my_pow(base, exponent);
        cout<<sum;
        return 0;
    }
    

    geschrieben,doch ich verstehe echt nicht wie das funktioniert.. ich kann selbst keinen Sinn darin lesen,ich brauche echt mal einen Kurs xD
    Nein,aber ich hab kein Mathevorstellungsvermögen 😞

    Irgendwie verstehe ich das nicht,aber "exp und ln" hat echt recht,mit solch einer Formel und Funktionen könnte das auch gut klappen^^

    Christoph schrieb:

    Wenn du dir mit der C++-Syntax unsicher bist, solltest du dir vielleicht erstmal ein gutes C++-Buch suchen.

    Hab ich,nähmlich diese C++ Primer 4th.

    exp und ln schrieb:

    oder du kannst einfach ab:=exp(bln(a))a^b := exp( b \cdot ln( a ) ) benutzen. dann brauchst du nur exp() und ln() zu implementieren.

    Ich habe es so versucht zu machen,aber trodzdem nichts daraus geworden :(..:

    int exponent(int ix);
    int potenz(int pot)
    {
        int ix;
        int zahl;
        pot = exponent(ix);
    return pot;
    }
    int main()
    {
        int pot;
        int ix = 2, zahl = 4;
        cout<<potenz(pot);
        return 0;
    }
    
    int exponent(int ix, int zahl)
    {
        zahl *= ix;
        return zahl;
    }
    

    Ich kann ja noch keine Funktionen eigentlich so ganz genau,ist erst im übernächsten Kapitel meines Buches,deswegen dauerts noch ein bisschen ^^
    Aber die Fehler oder so könntest du mir erklären,wenn du nur könntest 😉
    Bzw. wie ich es richtig machen könnte.

    @Christoph:
    Könntest du mir bitte die Lösung von meinem ersten Problem schreiben und von diesem,wenn ich es noch nicht verstanden hab?
    Bzw. könntest du es mir ausführlicher erklären(also deins war sehr gut beschrieben,doch ich kann solche Worte einfach nicht begreifen :()

    Mit freundlichen Grüßen
    Daniel



  • :Daniel: schrieb:

    Also ich hab

    int my_pow(int base, int exponent)
    {
        // 2*2
      for(int result = 1; result >= exponent; result *= base)
      return result;
    }
    /* ... */
    

    geschrieben,doch ich verstehe echt nicht wie das funktioniert..

    Das funktioniert so auch nicht. Die main()-Funktion ist in Ordnung, aber my_pow hat noch einen Bug.
    Deine for-Schleife hat als Rumpf den Befehl "return result;". Das wird exakt einmal ausgeführt, weil ein return die Funktion sofort beendet. Vermutlich wolltest du noch ein Semikolon hinter das for(...) setzen.

    Die Abbruchbedingung ist aber auch seltsam: Solange result >= exponent ist, mache result*=base. Die Beziehung zwischen result und exponent spielt hier aber gar keine Rolle. exponent ist eine Zahl, und dein Ziel ist es den Befehl "result *= base;" so oft auszuführen, wie diese Zahl angibt. Wenn exponent z.B. 5 ist, dann muss 5 Mal der Befehl "result *= base;" ausgeführt werden.

    Wie sieht das Standard-Vorgehen für eine Schleife aus, die n Mal ausgeführt wird?



  • hi,

    danke für deine Antwort 😉
    Also ich würde das gerne so machen(weiß aber nicht wie),sodass "base" so oft multipliziert wird,wie es der Exponent angibt,also eine Potenz ist,nur kA wie ich das in C++ machen könnte.

    Christoph schrieb:

    Wie sieht das Standard-Vorgehen für eine Schleife aus, die n Mal ausgeführt wird?

    Bitte sag es mir,wie die Lösung auf diese Frage heisst,dann mach ich neuen Code und stell ihn wieder vor ^^

    Daniel 🙂



  • :Daniel: schrieb:

    Christoph schrieb:

    Wie sieht das Standard-Vorgehen für eine Schleife aus, die n Mal ausgeführt wird?

    Bitte sag es mir,wie die Lösung auf diese Frage heisst,dann mach ich neuen Code und stell ihn wieder vor ^^

    for(int i = 0; i < n; ++i) {...}
    

    Ich verschieb das mal nach C++, weil du damit anscheinend mehr Probleme als mit Mathematik hast.



  • Dieser Thread wurde von Moderator/in Christoph aus dem Forum Mathematik in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Die Fehler waren zunächst, dass die Eingabe überprüft nicht wurde und danach, dass du den falschen Wert multipiziert hast: Die Variable iar anfangs 0 und dann wird mit ihr multipliziert==> Das ergebnis wird immer null sein.

    Das was ich anzumerken habe, war, dass du das "==" Zeichen (anstatt "<="/ ">=")in der For-Bedingung benutzt (eigendtlich kein Fehler aber, falls du kompliziertere Algorithmen erstellen solltest ist das eine mögliche Fehlerquelle)

    Den besseren Weg,wenn du nur Zweierpotenzen benutzen wolltest(so wie es in dem ersten Beitrag stand) ist folgendes:

    int /*BYTE*/ shift;
    cin >> shift;
    if (shift >= 0 && shift <= 0x40 /*kann auch was anderes sein*/)
    long result = 0x01 << shift;
    else
    cout << "Wrong input";
    

    Außerdem hatte ich das "Kommentar" und den cpp-Code-tag nicht brücksichtigt...

    Mein Weg:

    // "int b": Die Basis
    // "char e": Der Exponent
    long my_pow(int b, char e)
    {
      if (e > 0x40) /* oder etwas anderes */
        return 0; // oder melde Fehler
    
      /* bei "int e"
      if (e < 0)
        return 0; // oder melde Fehler
    
      if (b == 0)
        return 0;
    
      if (c == 1) /* Fehler korrigert, siehe nächsten Post */
        return b;
    
      for(long i = 2, r = 1; i++ > e; r *= b);
      return r;
    }
    

    Mit freundlichen Grüßen
    Rhombicosidodecahedron

    ^Fehler: |^



  • Und noch ein Fehler in der Schleife...

    Hier die richtige Lösung:

    for(int i = 1, r = 1; i <= e; r *= b; i++);
      return r;
    


  • Th schrieb:

    Und noch ein Fehler in der Schleife...

    Hier die richtige Lösung:

    for(int i = 1, r = 1;/*1*/ i <= e;/*2*/ r *= b;/*3*/ i++);
      return r;
    

    Drei Semikolions sind nicht erlaubt 😉 ... richtig ...richtig relativ

    Aber danke



  • hi

    danke,aber das funktioniert noch immer nicht:

    int e = 2;
        int b = 5;
        int i = e = 2;
        for(int i = 1, r = 1; i <= e; r *= b, i++);
        cout<<i;
    

    habs nähmlich in main() geschrieben,um eine Funktion daweil zu vermeiden.
    was ist überhaupt r?





  • r steht hier wohl fuer resultat, also musst du auch cout<<r schreiben.

    Etwas expliziter:

    int exponent=6;
    int resultat=1;
    int basis=4;
    for(int i=0;i<exponent;++i)
     resultat=resultat*basis;
    
    cout<<resultat;
    

    So besser verstaendlich?

    EDIT: Das entspraeche jetzt 4^6.


Anmelden zum Antworten