Programmcode für Rätsel?

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.

Woher ich das weiß:Berufserfahrung

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

Woher ich das weiß:Studium / Ausbildung – Info studium rwth aachen

BlackWillma  10.09.2019, 15:22

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

traffixHD7 
Beitragsersteller
 10.09.2019, 15:56
@BlackWillma

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.

BlackWillma  10.09.2019, 16:17
@traffixHD7

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

traffixHD7 
Beitragsersteller
 10.09.2019, 16:20
@BlackWillma

Okay, vielen vielen Dank. Bekommst sicher die hilfreichste Antwort.

traffixHD7 
Beitragsersteller
 10.09.2019, 15:19

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.

Woher ich das weiß:Studium / Ausbildung – Softwareentwickler, B. Sc. Informatik

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.