Ich verbringe meinen Abend damit, einige Programmierprobleme von Kattis zu machen. Es gibt einen Teil des Problems 4 thought, auf dem ich feststecke.Die Reihenfolge der Operationen während einer sequentiellen Berechnung beibehalten
Bei einer gegebenen Zahl soll das Programm die erforderlichen Operationen (+, -, * oder /) zwischen 4 Vieren zurückgeben, um diese Zahl zu erreichen.
Zum Beispiel der Eingabe
9
in der Ausgabe führen würde
4 + 4 + 4/4 = 9
Meine Lösung (nicht effizient, aber einfach) ist, alle Möglichkeiten zu bewerten, über die Operatoren zu kombinieren und sehen wenn eine der Kombinationen das gewünschte Ergebnis erzielt.
Um dies zu tun, habe ich die Funktion geschrieben, die unten zu sehen ist. Es nimmt ein Array von Zeichen auf, die die auszuwertenden Operatoren sind (uo[3]
, könnte wie {+, /, *}
aussehen), und das gewünschte Ergebnis als eine Ganzzahl (expRes
).
bool check(char uo[3], int expRes) {
int res = 4;
for(int oPos = 2; oPos >= 0; oPos--) {
switch (uo[oPos]) {
case '+' : res += 4; break;
case '-' : res -= 4; break;
case '*' : res *= 4; break;
case '/' : res /= 4; break;
}
}
return res == expRes;
}
Ich erkannte, dass dieser "sequenzielle" Ansatz mit einem Problem verbunden ist: Es folgt nicht der Reihenfolge der Operationen. Wenn ich die Funktion mit uo = {+, -, /}
und expRes = 7
zu nennen war, würde es return false seit 4 + 4 = 8, 8-4 = 4, 4/4 = 1. Die wirkliche Antwort offensichtlich wahr ist, da 4 + 4 - 4/4 = 7.
Kann jemand von Ihnen an eine Möglichkeit denken, die Funktion neu zu schreiben, so dass die Auswertung der Reihenfolge der Operationen folgt?
Vielen Dank im Voraus!