Multiplizieren wir 192 mit 1, 2, 3.
192 × 1 = 192
192 × 2 = 384
192 × 3 = 576
Die Verkettung der Produkte ergibt eine pan-digitale Zahl von 1 bis 9 192384576. Wir nennen 192384576 das verkettete Produkt von 192 und (1,2,3).
Auf die gleiche Weise ergibt das Multiplizieren von 9 mit 1,2,3,4,5 und das Verketten die pan-digitale Nummer 918273645. Dies ist das verkettete Produkt von 9 und (1,2,3,4,5). Gibt es.
Was ist die größte 9-stellige pan-digitale Zahl, die als verkettetes Produkt einer ganzen Zahl und (1,2, ..., n) (n> 1) erhalten wird? http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2038
Zuerst habe ich einen Generator erstellt, der aus einer bestimmten Anzahl von Zahlen eine bestimmte Anzahl von pan-digitalen Zahlen (Zeichenketten) generiert.
import copy
def pandigital(digit,seq1,seq2=[]):
iter1 = map(str,seq1)
if seq2:
iter2 = map(str,seq2)
else:
iter2 = copy.deepcopy(iter1)
for d in range(digit-1):
iter1 = (x+y for x in iter1 for y in iter2 if not (y in x))
return iter1
Geben Sie Folgendes an, um einen Generator mit einer 10-stelligen Pan-Digital-Nummer zu generieren, die am Anfang keine 0 enthält. Wenn seq2 weggelassen wird, wird seq1 nach seq2 kopiert.
pandigital(digit=10,seq1=range(1,10),seq2=range(0,10))
Ich denke, dass dieser Generator Werte in aufsteigender Reihenfolge zurückgibt, wenn Sie den Bereich (1,10) überschreiten, und Werte in absteigender Reihenfolge zurückgibt, wenn Sie den Bereich (10,1, -1) übergeben.
Um diese Frage zu beantworten, erstellen Sie zunächst mit der obigen Funktion einen Satz 9-stelliger pan-digitaler Zahlen, PAND_SET. Um später zu ermitteln, ob andere Zahlen in diesem Satz von Pan-Digital-Zahlen enthalten sind, wird set () hier verwendet, um es unter Berücksichtigung der Referenzgeschwindigkeit zu einem Objekt vom Typ Set zu machen.
Führen Sie als nächstes eine Schleife i von 2 bis 10.000 durch und führen Sie die folgende Berechnung durch, bis s eine 9-stellige Zahl (Zeichenfolge) ist. s = str (i) + str (i * 2) + str (i * 3) ・ ・ ・
Überprüfen Sie, ob das auf diese Weise berechnete s größer als der Antwortkandidat ans ist und ob s in PAND_SET enthalten ist. Wenn beide zutreffen, ersetzen Sie ans durch s.
import pandigital
def main():
SEARCH_MAX = 10**4
PAND_SET = set(pandigital.pandigital(9,range(1,10)))
ans = 0
for i in range(2,SEARCH_MAX):
s = str(i)
j = 2
while len(s)<9:
s += str(i*j)
j+=1
if len(s)>=10:
continue
if int(s) > ans and s in PAND_SET:
ans = int(s)
print ans
main()
Recommended Posts