2016-06-28 3 views
1

Ich habe eine Aufgabe, ein C++ - Programm zu erstellen, um alle möglichen mathematischen Gleichungen mit Operatoren zu finden. Im Folgenden wird die Frage angezeigt:Erstellen Sie ein Programm in C++, um alle möglichen Gleichungen zu berechnen

Gegeben eine Reihe von Zahlen, zum Beispiel {5, 3, 7, 3 und 11}. Finde alle möglichen mathematischen Gleichungen mit Operatoren wie +, -, *,/so, dass die Gleichung die gegebene Antwort ergibt. Zum Beispiel 5 + 7-3/3 = 11.

Ich brauche eine Idee, wie man mit dem Code beginnt. Ist es wie Brute-Force-Algorithmus? Ich habe keine Ahnung, wie man die Operatoren austauscht, um die mögliche Gleichung zu erstellen. Ich frage nicht nach einer vollständigen Lösung, sondern nur nach einer Idee, wie man mit der Codierung beginnt.

+0

Brute-Force ist eine Option, aber Sie können auch die Ergebnisse speichern, um schneller – Thomas

+0

Trotz der Abwärts Stimmen, es sieht aus wie eine interessante Frage sowohl in Bezug auf die Programmierung und Mathe. Sie könnten versuchen, einen Algorithmus zu machen, um dies durch Brute-Force zu lösen, aber Sie haben viel Code, um für die möglichen Lösungen zu schreiben – meJustAndrew

+0

Ich sehe keinen Weg um den Brute-Force-Ansatz. Das ist eine ganz interessante Frage ... unterscheiden sich die Zahlenreihen in der Größe? Das Beispiel zeigt ein Array von 5 Zahlen, aber könnte es mehr oder weniger Zahlen geben? – 7Nate9

Antwort

3

Sie könnten darüber so denken. +, -, *,/kann als 1,2,3,4 behandelt werden. Nun, wenn Sie alle verschiedenen Kombinationen für jede beliebige Anzahl von Zahlen versuchen würden, könnten Sie es so betrachten. Beispiel. 4 Nummern.

1,1,1,1 1,1,1,2 1,1,1,3 1,1,1,4 

1,1,2,1 1,1,2,2 1,1,2,3 1,1,2,4 

und so weiter und so weiter. Hoffe das könnte helfen!

+0

aber sei vorsichtig mit dem * und/sie sind verbindlich mehr als + und - – Thomas

+2

Dies ist ziemlich relevant über die Anzahl der Möglichkeiten des Algorithmus, in der Tat – meJustAndrew

+0

Vielen Dank für die Idee bro.Aber, wie man den Operator eins nach dem anderen als sagst du, Bruder? Verschachtelte Schleife? Ich denke, tats eine schlechte Idee. Zweitens, wo und wie man die Betreiber bro speichert. In einer Reihe? Als Schnur? Wenn ja, wie kann man die String-Operatoren wieder in den ursprünglichen Zustand zurückversetzen, damit sie die Operationen ausführen kann? –

3

Ich würde gerne sagen, dass dies nicht meine ursprüngliche Idee ist. Ich werde den Verweis unten hinzufügen. Finden Sie den C++ - Code unten. Es könnte dir etwas helfen, so wie es für mich war.

#include <iostream> 
#include<string> 
using namespace std; 

void cntdwn(double sum, double previous, string digits, double target, std::string expr) { 
    if (digits.length() == 0) { 
    if (sum + previous == target) { 
     std::cout<<expr << " = " << target; 
    } 
    } else { 
    for (int i = 1; i <= digits.length(); i++) { 
     double current = std::stod(digits.substr(0, i)); 
     string remaining = digits.substr(i); 
     cntdwn(sum + previous, current, remaining, target, expr + " + " + std::to_string(current)); 
     cntdwn(sum, previous * current, remaining, target, expr + " * " + std::to_string(current)); 
     cntdwn(sum, previous/current, remaining, target, expr + "/" + std::to_string(current)); 
     cntdwn(sum + previous, -current, remaining, target, expr + " - " + std::to_string(current)); 
    } 
    } 
} 

void f(string digits, double target) { 
    for (int i = 1; i <= digits.length(); i++) { 
    string current = digits.substr(0, i); 
    cntdwn(0, std::stod(current), digits.substr(i), target, current); 
    } 
} 

int main() { 
    // The digits go as concatenated string 
    f("5373",11); 
    return 0; 
} 

Ausgang:

5 * 3.000000 - 7.000000 + 3.000000 = 11 

Referenzen:

Generate all combinations of mathematical expressions that add to target (Java homework/interview)

https://math.stackexchange.com/questions/459857/using-operators-and-4-4-4-4-digits-find-all-formulas-that-would-resolve

https://www.careercup.com/question?id=5735906000502784

Zusätzliche Anmerkung

a) This code will not make any combinations for the digits. For example if we give (4,4,4,4) as numbers and 10 as target then it will not give any result as the solution in that case should be [(44-4)/4] {this example has been picked from second reference]. 

b) And this problem is a classic algorithmic problme popularly known as "Countdown Problem" picked from famous UK game. 
+0

Vielen Dank für die Erklärung Rudrani. Kann mir eine Idee geben, wie man Klammern in die Gleichungen einfügt? –

+0

Vielleicht möchten Sie einen Blick auf https://en.wikipedia.org/wiki/Operator-precedence_parser#Alternatives_to_Dijkstra.27s_Algorithm werfen. Unten finden Sie ein Beispiel, wie eine Gleichung vollständig paranisiert werden kann. –

Verwandte Themen