Programm, das die 20. Potenz ausrechnet



  • Hallo zusammen, ich bin noch recht neu bei C++ und versuche gerade ein Programm zu schreiben, durch das der Nutzer aufgefordert wird, eine Zahl einzugeben. Das Programm berechnet dann die 20. Potenz und gibt diese dann aus.
    Beim Compilieren gab's keine Fehlermeldung und die Konsole gibt auch eine Zahl aus, jedoch nicht die richtige. Kann mich jemand auf den Fehler hinweisen?
    Wenn jemand sonst noch irgendwelche Tips bezgl. des Codes hat, wäre ich sehr dankbar.
    Lg.
    Hier ist der code

    //power20
    #include <iostream>

    int main()
    {
    //input
    std::cout << "Zahl a eingeben fuer a^20 ";
    int a;
    std::cin >> a;

    //calculation
    int b;
    b = a * a; //a^2
    b = b * b; //a^4
    b = b * b; //a^8
    b = b * b; //a^16

    int c;
    c = a * a; //a^2
    c = c * c; //a^4

    int d;
    d = b * c;

    //output
    std::cout << d;

    return 0;
    }



  • Klappt für a=0,1,2,-1,-2

    Für andere Zahlen gibts einen Integer-Überlauf. Also Programm an sich korrekt, nur lassen sich so tiesige Zahlen wie 3^20 nicht in einem int fassen.



  • Da du nicht schreibst, welche Zahl du eingibst, was rauskommt und was du erwartest, kann ich nur mutmaßen, dass du eine Zahl eingibst, für die die 20. Potenz nicht mehr im Wertebereich von int liegt. Also alles außer -2, -1, 0, 1, 2.



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



  • Computer haben endliche Kapazität und könne daher nicht beliebige Berechnungen exakt ausführen. Was genau ist denn das Problem, das du lösen willst?



  • 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