Programm, das die 20. Potenz ausrechnet



  • Das ist nur eine Übungsaufgabe. Sollte ich es mit einer niedrigeren Potenz probieren?


  • Mod

    Morgoth237 schrieb:

    Danke für die schnellen Antworten.
    Aber wisst ihr auch, wie ich das Problem lösen kann?

    Indem du einen Datentyp nutzt, der größere Zahlen darstellen kann. Das könnten zum Beispiel long oder long long sein, die mindestens bis 2^63-1 (selten auch mehr) gehen. Aber wirklich viel besser ist das auch nicht, denn log_20(2^63) ist ungefähr 14, was dann die größte Basis wäre, zu der du noch ein Ergebnis ohne Überlauf bekommst.
    Besser ist daher, sich zu fragen, ob man überhaupt ein exaktes Ergebnis benötigt. Muss man wirklich alle Stellen einer hundertstelligen Zahl genau kennen oder reichen nicht auch die ersten 15 und dann sagt man einfach, dass noch 85 Nullen folgen? Fließkommazahlen können dies leisten. float und double (und long double) haben zwar weniger zählende Stellen als ihre Ganzzahlgegenstücke, aber dafür reicht der darstellbare Wertebereich von -Unendlich bis +Unendlich. Außerdem kann man dann auch die pow-Funktion aus cmath zum Berechnen der Potenzen benutzen.

    Morgoth237 schrieb:

    Das ist nur eine Übungsaufgabe. Sollte ich es mit einer niedrigeren Potenz probieren?

    Was ist denn die Aufgabe? Wenn die Aufgabe verlangt, die 20 Potenz von irgendwas auszurechnen, dann ist eine der folgenden Aussagen wahr:
    -Die Übungsaufgabe wurde von jemandem gestellt, der dieses Problem nicht vorhergesehen hat, sprich: Keine Ahnung hat.
    -Die Übungsaufgabe wurde von jemandem gestellt, der dieses Problem vorhergesehen hat und es ist im Sinne der Aufgabenstellung, dieses zu lösen.



  • Die Aufgabe lautet:
    Write a program power20.cpp that reads an integer a from the standard input and outputs a20

    jedoch habe ich gerade die Lösung bekommen. Darin wurde das Problem anders gelöst als ich es gemacht habe, es steht auch, (wie ober bereits erwähnt) dass nur -2,-1,0,1,2 möglich sind.

    Damit wäre die Frage wohl geklärt. 🙂
    Vielen Dank für alle Antworten!



  • Beschäftige dich doch mal mit RSA-Algorithmen. Da wird das Problem aufgegriffen. Die Potenzen dort sind weit größer als 20 und die Basis kann größer als 14 sein, was sie ja auch sein muss.


  • Mod

    n3wbie schrieb:

    Beschäftige dich doch mal mit RSA-Algorithmen. Da wird das Problem aufgegriffen. Die Potenzen dort sind weit größer als 20 und die Basis kann größer als 14 sein, was sie ja auch sein muss.

    Guter Hinweis, aber ich glaube, das ist momentan vermutlich noch deutlich zu schwierig für den Threadersteller.



  • SeppJ schrieb:

    n3wbie schrieb:

    Beschäftige dich doch mal mit RSA-Algorithmen. Da wird das Problem aufgegriffen. Die Potenzen dort sind weit größer als 20 und die Basis kann größer als 14 sein, was sie ja auch sein muss.

    Guter Hinweis, aber ich glaube, das ist momentan vermutlich noch deutlich zu schwierig für den Threadersteller.

    Ich glaube, sein Level C++ reicht schon, um die paar Formeln zu implementieren. Jeder kann Formeln in C++ zu konvertieren. Alles, was im fehlen könnte ist ein bisschen Mathe.



  • n3wbie schrieb:

    Beschäftige dich doch mal mit RSA-Algorithmen. Da wird das Problem aufgegriffen. Die Potenzen dort sind weit größer als 20 und die Basis kann größer als 14 sein, was sie ja auch sein muss.

    Thema verfehlt. Dort brauchen sie powMod, nicht pow.



  • Morgoth237 schrieb:

    Wenn jemand sonst noch irgendwelche Tips bezgl. des Codes hat, wäre ich sehr dankbar.

    Ich würde mehr Variablen benutzen und sie ein wenig klarer benennen.

    #include <iostream>
    
    int main() {
    	std::cout << "Zahl a eingeben fuer a^20 ";
    	int a;
    	std::cin >> a;
    
    	int a2=a*a;
    	int a4=a2*a2;
    	int a8=a4*a4;
    	int a16=a8*a8;
    	int a20=a4*a16;
    
    	std::cout << a20 << '\n';
    }
    


  • Danke für die vielen Tipps. Ich habe noch nicht mit Algorithmen begonnen, werde dies aber bald tun.



  • Was du bräuchtest sind einfach big Integer.
    Zb mit Python funktioniert das ganz leicht:

    >>> a = 109
    >>> a ** 20
    56044107677782919374398655242916531006801
    

    Für C++ müsstest du eine der Bibliotheken verwenden. Aber vermutlich nicht im Sinne der Aufgabe.



  • volkard schrieb:

    Ich würde mehr Variablen benutzen und sie ein wenig klarer benennen.

    #include <iostream>
    
    int main() {
    	std::cout << "Zahl a eingeben fuer a^20 ";
    	int a;
    	std::cin >> a;
    
    	int a2=a*a;
    	int a4=a2*a2;
    	int a8=a4*a4;
    	int a16=a8*a8;
    	int a20=a4*a16;
    
    	std::cout << a20 << '\n';
    }
    

    Das ist eine subtile und gute Einführung zum Square-and-Multiply-Algorithmus. 👍


Anmelden zum Antworten