Hallo Hotti,
ich versuche Dir zu erklären, was ich Dir mit meinen ersten beiden Einträgen sagen wollte. Ich hatte gehofft, Du verständest das auch ohne detaillierte Erläuterung.
Nein, ich muss Ziffern kaufen. Eine Ziffer kostet 1 € und das läppert sich dann schon zusammen.
Im Prinzip hab ich die Summe ja schon ausgerechnet. Empirisch ermittelt eben. Aber als Programmierer kommen mir da schon Bedenken, ob das auch stimmt ;-)
wenn Du beim Programmieren keine Logik reinstecken willst (kannst, darfst, ...), dann nimmst Du halt "brute force". Wenn Du bei diesem Problem Logik verwenden darfst, dann erübrigt sich das Programmieren :-)
Bringst Du bei einem allgemeinen Problem Deinem Code die zugrunde liegende Logik nicht in entsprechenden Kommentaren ein, schreibst Du miserablen Code.
/***
** int anzahl_ziffern(int ziffer)
**
** gibt die Mindestanzahl an Exemplaren der vorgegebenen ziffer zurück,
** die benötigt werden, um den Tag/Monat-Anteil eines beliebigen gültigen
** Datums im bei uns üblichen Kalender darzustellen. Die Darstellung
** erfolgt ohne führende Nullen.
**
** Betrachtung (siehe auch Ingo):
** Maximal werden vier Stellen benötigt
** t1 von 1 bis 3
** t2 von 0 bis 9
** m1 nur 1
** m2 von 0 bis 9
**
** Somit werden maximal benötigt:
** 1 : 4
** 2, 3 : 3
** 4 - 9, 0 : 2 Exemplare
**
** Es gibt folgende Daten:
** 11.11. => 4 x 1
** 22. 2 => 3 x 2
** 3. 3. => mindestens 2 x 3
** 4. 4. => 2 x 4
** 5. 5. => 2 x 5
** 6. 6. => 2 x 6
** 7. 7. => 2 x 7
** 8. 8. => 2 x 8
** 9. 9. => 2 x 9
** 10.10. => 2 x 0
**
** Die einzige Möglichkeit, bei der drei 3en erforderlich wären, wäre der
** 33. 3. (da m1 keine 3 aufweist). Dies ist kein gültiges Datum, daher
** werden maximal nur 2 Dreien benötigt.
**
** => Damit ist genau bestimmt, wieviele Exemplare von jeder Ziffer
** minimal benötigt werden:
**
** 1 : 4
** 2 : 3
** 3 - 9, 0 : 2 Exemplare
**
** Übergabeparameter: eine Ziffer
** Rückgabe:
** bei Übergabe von 1 : 4
** 2 : 3
** einer anderen Ziffer : 2
**
** Anmerkung:
** Wenn der Übergabeparameter keine Ziffer ist, wird eine
** Eingabewertverletzung ausgelöst.
**/
Funktion anzahl_ziffern(Übergabe: ziffer) {
Betrachte ziffer
Wenn 1
gebe 4 zurück
Wenn 2
gebe 3 zurück
Wenn 0 oder zwischen 3 und 9 (einschließlich Grenzen)
gebe 2 zurück
Sonst
melde eine ungültige Eingabe
Ende Betrachtung ziffer
/* Alternative Implementationen sind selbstverständlich möglich */
/* Beispiel:
** Erstelle ein 0-basiertes Feld mit 10 Einträgen, das die Werte
** 2, 4, 3, 2, 2, 2, 2, 2, 2, 2
** enthält.
** Gib den Feld(ziffer) (in diversen Programmiersprachen schreibt man
** dies Feld[ziffer]) zurück.
** Eine gegebenenfalls ausgelöste Bereichsverletzung passt wunderbar.
*/
Ende der Funktion
Welches Problem hast Du nun damit einen "Algorithmus" zur Lösung des Problems zu finden? Wenn Du schon anfängst durchzuzählen, dann kannst Du gleich jeden einzelnen Tag zählen, jede weitere "Logik", um weniger zählen zu müssen, wäre vergeudete Zeit. [1]
Erklärende Grüße
Vinzenz
[1] so wie die Zeit, die ich mir für diesen Beitrag für ein nichtexistentes
Problem nahm.