Programmcode für Rätsel?
Hallo,
kann mir jemand ein Programmcode oder Tipps/nötigen Befehle zu folgenden Quiz geben:
Gesucht: Achtstellige natürliche Zahl
Bedingung: -alle Ziffern sind verschieden
-Die Zahl ist durch 36 teilbar
Aufgabe: Kleinstmögliche Zahl mit genannten Bedingungen zu bilden
Das Rätsel habe ich bereits gelöst, jedoch weiss ich nicht wie ich es in einem Programmcode umsetzen kann (Python gewünscht)
Danke im voraus.
5 Antworten
BlackWillma hat ja schon eine gute Lösung präsentiert.
Hier siehst Du mal einen komplett anderen Ansatz, bei dem zuerst eine Permutation aus 8 Ziffern gebildet wird, und dann geprüft wird, ob die Zahl passt:
from itertools import permutations
for t in permutations('0123456789',8):
n=int(''.join(t))
if n>=10_000_000 and n%36==0:
print(n)
break
Welcher Code effizienter ist, hängt wohl vom Einzelfall ab. Aber es ist immer gut, wenn man mehrere Varianten kennt.
Hab mir auch ein bisschen Gedanken gemacht.
- Eine 8-stellige Zahl die möglichst klein ist muss mit 1 beginnen.
- die zweite Zahl muss dann eine 0 sein.
- die dritte Zahl muss eine 2 sein, da 0 und 1 schon verwendet wurden.
- usw.
Also die kleinste Zahl mit 8 verschiednen Ziffern ist die
10234567
Vorher treten auf jeden Fall keine 8 verschiedene Ziffern auf.
Die nächst größere Zahl die durch 36 Teilbar ist:
(int(10234567/36)+1)*36=10234584
Und die größte durch 36 Teilbare zahl ist:
int(99999999/36)*36=99999972
Besser noch (logik, wie die kleinste Zahl):
int(98765432/36)*36=98765424
Und das packen wir in eine Schleife:
for i in range(10234584,98765424+1,36):
if(len(set(str(i)))==8):
print(i)
break
(+1 damit die letzte Zahl auch geprüft wird, hier nicht notwendig, aber für eventuelle Abwandlungen möglicherweise sinnvoll)
Benötigt etwa 50µs auf meinem PC
10000000 ist die kleinste achtstellige zahl und 10000000/36=277777.7, d.h. 36*277778=10000008 ist die kleinste achtstellige zahl, die durch 36 teilbar ist.
mit ihr würde ich anfangen und dann überprüfen, ob bei der aktuellen zahl alle ziffern verschieden sind. wenn ja ist das das ergebnis, wenn nicht addierst du 36 und wiederholst das ganze bis du eine lösung gefunden hast oder das ergebnis 9stellig ist
Okay vielen Dank. Ich habe alles verstanden, jedoch kannte ich "set" nicht, daher noch eine Frage. Du hast geschrieben "dann in ein set einfügt und dann die anzahl der elemente im set zählt", und wie wird das gewährleistet, dass diese Elemtente auch verschieden sind? Sehen gerade nicht den Unterschied dazu als hätte ich normal len (str(num)) geschrieben.
set bedeutet menge. in einer menge kann ein element nicht doppelt vorkommen. wenn eine ziffer mehrfach vorkommt wird sie nach dem ersten mal nicht ins set eingefügt und das set wird nicht größer. wenn ich jetzt eine achtstellige zahl so ins set einfüge und das set am ende 8 elemente enthält heißt das, dass die ziffern verschieden waren, weil eine doppelte ziffer beim zweiten mal nicht eingefügt wird und das set darum weniger als 8 elemente enthält. len(str(num)) würde dir nur die anzahl der ziffern geben und die wäre ja immer 8
Okay, vielen vielen Dank. Bekommst sicher die hilfreichste Antwort.
Danke für deinen Kommentar, so ähnlich hatte ich es auch schon im Kopf. Hatte meinen Beitrag eigentlich noch bearbeitet(aber wohl nicht gespeichert) Daher hier: mein Größtes Problem ist, dass ich nicht weiß wie ich Prüfen soll ob bei der aktuellen Zahl die Ziffern verschieden sind (Anfänger Programmieren)
python war geforder, ich liefere javascript weils mit fiddle am einfachsten zu zeigen ist und damit du auch noch etwas zu tun hast
https://jsfiddle.net/gzbkwfeh/
kurz erklär:
einfach beginnend bei 1000000 für jede zahl prüfen ob eine ziffer zwei mal vor kommt und wenn nicht, prüfen ob sie durch 36 teilbar ist.
Du könntest alle durch 36 teilbaren, 8-stelligen Zahlen auf die unterschiedlichen Ziffern prüfen lassen, indem du ihre Stellen mit Division mit Rest heraus nimmst und auf Gleichheit untersuchst.
https://onlinegdb.com/SJGxmXHLr
hier ist das als python code
len( set(str(num))) gibt die anzahl der verschiedenen ziffern an, indem es die zahl erst in einen string umwandelt,den dann in ein set einfügt und dann die anzahl der elemente im set zählt