mario::konrad
programming / C++ / sailing / nerd stuff
Riddle: Combinations (Apero 45/2000)
© 2000 / Mario Konrad

Aufgabe

Dieser Aufgabentext entspricht nicht dem Wortlaut der in der Lokalzeitung (Apero, Nr. 45/2000) abgedruckten Aufgabe.

Gegeben sind die Ziffern 1..9 in dieser Reihenfolge. Es sollen nun alle Möglichkeiten konstruiert werden, die ein Resultat von 100 ergeben. Die Rechnung muss als Kombination von diesen Ziffern und den beiden Operationen + und - dargestellt werden. Dabei ist es egal ob mehrere Ziffern zu einer Zahl zusammengefasst werden oder alleine Stehen. Beispiele:

1+2+3+4+5+6+7+8+9=?
123+456-789=?

Die Ziffern dürfen nicht vertauscht, vervielfacht oder weggelassen werden.

Wieviele Kombinationen gibt es? Welche sind es?

Umsetzung

Dies ist keinesfalls die einige mögliche Lösung. Warum eine Lösung selbst suchen, wenn dies ein Computer auch machen kann, dachte ich mir als ich die folgende Lösung geschrieben habe.

Diese Lösung ist nicht unbedingt die optimalste. Es werden Strings erzeugt mit entsprechenden Kombinationen von Ziffern und Operationszeichen. Diese Strings werden dann mit Hilfe eines Interpreters berechnet. Ist das Resultat 100 so ist eine Lösung gefunden. Denkbar wären auch andere Resultate, ist jedoch nur eine kleine Anpassung.

Hier nun die EBNF (Erweitere Back-Naur-Form) des Interpreters:

calculation ::= number { op number } equals.
number      ::= figure { figure }.
figure      ::= '0' .. '9'.
op          ::= plus | minus;
plus        ::= '+'.
minus       ::= '-'.
equals      ::= '='.

Lösung

Hier nun die richtigen Lösungen (komplette Liste):

123-4-5-6-7+8-9= 100
1+23-4+56+7+8+9= 100
12+3-4+5+67+8+9= 100
1+2+34-5+67-8+9= 100
123+45-67+8-9= 100
1+2+3-4+5+6+78+9= 100
1+23-4+5+6+78-9= 100
12-3-4+5-6+7+89= 100
12+3+4+5-6-7+89= 100
123+4-5+67-89= 100
123-45-67+89= 100

Download

Die auf dieser Seite aufgeführten Sourcecodes dürfen uneingeschränkt verwendet, kopiert, verändert und publiziert werden. Jegliche Haftung wird abgelehnt, die Verwendung des hier publizierten Materials geschieht auf eigenes Risiko.

Build and Run

$ g++ -Wall -Wextra -o findsum findsum.cpp
$ ./findsum