In einem Codierungsproblem Auswertung ich seit einiger Zeit arbeiten jetzt habe, habe ich zu einem Schritt kommen, wo ich einen mathematischen Ausdruck zu bewerten haben, die wie folgt aussieht:einen mathematischen Ausdruck in C++
3 * 2^3^2 * 5
und sollte wie folgt bewertet werden:
3 * 2^3^2 * 5 = 3 * 2^(3 * 2) * 5 = 3 * 64 * 5 = 960.
In der aktuellen Form meiner Implementierung, ich zwei Vektoren haben, enthält man die Operanden als ganze Zahlen, während die andere die Operatoren als Zeichen enthält. Für den aktuellen Fall wären dies: vector<int> operands = { 3, 2, 3, 2, 5 }
und vector<char> operators = { '*', '^', '^', '*' }
.
Dies ist nur ein Beispiel, die Reihenfolge der Operationen kann sich in dem Sinne unterscheiden, dass die Multiplikation nicht immer die erste/letzte durchgeführte Operation ist.
Ich bin seit einiger Zeit an diesem speziellen Schritt fest, nämlich den von den beiden Vektorcontainern gekapselten Ausdruck zu einer ganzen Zahl zu bewerten. Ich habe mir einige mathematische Parser angeschaut, die ich im Internet finden konnte, aber ich sehe immer noch nicht, wie man eine korrekte Auswertung durchführt.
Eine Lösung würde sehr geschätzt werden.
Meinst du wirklich '2^(3 * 2)' und nicht '2^(3^2)'? –
Nein, das ist eigentlich der Ausdruck, den das Problem auferlegt, könnte nicht viel dagegen tun. 2^3^2 sollte als 2^(3 * 2) = 2^6, allgemeiner y^x1^x2^...^xn = y^(x1 * x2 * .... * xn) betrachtet werden. – user43389
@ user43389 Nein, 2^3^2 sollte als 2^(3^2), = 2^9 = 512 ausgewertet werden, und beachten Sie, dass es rechtsassoziativ ist. Was du geschrieben hast ergibt keinen Sinn. – EJP