Potenzen in c# ausrechnen nur durch addieren?

4 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

...hatte bei meiner ersten Antwort wohl einen kleinen Lapsus...

nach etwas Gassirunde mit dem Hund hatten die grauen Zellen wieder etwas Sauerstoff. Es geht auch ohne Rekursion:

using System;
class Prog{
    static ulong BadPow(ulong basis,uint exponent){
        ulong aktuelleBasis=basis;
        ulong produkt=basis;
        for (int i=1;i<exponent;++i){
            Console.WriteLine("neue Basis :" +produkt); //mal gucken  wo  wir stehen
            for (ulong j=1;j<basis;++j){
                Console.WriteLine("aktuelles Produkt:" +produkt); //mal gucken  wo  wir stehen
                produkt+=aktuelleBasis;
            }
            aktuelleBasis=produkt;
            Console.WriteLine("aktuelles Produkt:" +produkt);//mal gucken  wo  wir stehen
            
        }
        return produkt;
    }


    public static void Main(string[] args){
        ulong basis=7;
        uint exponent=13;
        
        ulong result=BadPow(basis, exponent);
        Console.WriteLine("Das Endergebnis ist: " + result);
        Console.WriteLine("Probe  mit Math.Pow: " + Math.Pow(basis,exponent));
        
        Console.WriteLine("beliebige Taste...");
        Console.ReadKey();
    }
}

Du kannst die Multiplikation durch eine Summe ersetzen und somit auch ganzzahlige Potenzen durch eine Summe ersetzen. Sinnhaft ist das eben nicht mehr und die Performance ist mies.

würde gerne Potenzen ausrechnen aber ohne multiplizieren und Math.pow.

echt mal? ...geht nicht gibts nicht...

Das Folgende ist natürlich nicht repräsentativ und kommt gleich nach Abakusrechnen😱 oder Erbsen zählen.

Hirnjogging für Opas (ich hoffe Du kannst den 💩 nachvollziehen)

using System;
class Prog{
   //ganz faule Sache: addiere eponent mal recursiv Basis 
  static long BadPow(long aktuelleBasis,long basis,int exponent){
    long produkt=aktuelleBasis;
    if (exponent==1) {
      return produkt;
    }
    else {
      //basis mal die aktuelle Basis addieren ergibt ein Produkt...
      for (int j=1;j<basis;++j){
        produkt+=aktuelleBasis;
        Console.WriteLine("aktuelles Produkt:" +produkt); //mal gucken wo wir stehen
      }
      Console.WriteLine("neue Basis an Recursion:" +produkt); //mal gucken wo wir stehen
      return BadPow(produkt,basis,--exponent);
    }   
  }
   
  public static void Main(string[] args){
    long result;
    long basis=7;
    int exponent=13;
     
    // ich war zu faul die metode für 2 Argument zu überschreiben deshhalb zweima das gleiche Argument Basis
    result=BadPow(basis,basis,exponent);

    Console.WriteLine("Das Endergebnis ist: " + result);
     
    Console.WriteLine("Probe mit Math.Pow: " + Math.Pow(basis,exponent));
     
    Console.WriteLine("beliebige Taste...");
    Console.ReadKey();
  }
}

Klar.

2³ = 2*2*2 = (2+2)*2 = (2+2) + (2+2)

Erzesel  07.10.2022, 20:42

der Ansatz passt aber dürfte bei kleinen Potenzen gerad noch überschaubar sein. Bei 7 hoch 13 wird das schon lustiger aussehen.

...und natürlich sollte die Funktion auch noch mit flexiblen eingaben zurechtkommen können.

..

0
Tannibi  07.10.2022, 20:52
@Erzesel

Bei 7^13 werden die Schleifen nur öfter durchlaufen.

Ich sehe es nicht als meine Aufgabe, hier komplette Programme
zu schreiben, sondern dem FS das Prinzip zu erklären, das er nicht verstanden hat.

0