Multiplions 192 par 1, 2, 3.
192 × 1 = 192
192 × 2 = 384
192 × 3 = 576
La concaténation des produits donne un nombre numérique pan de 1 à 9 192384576. Nous appelons 192384576 le produit concaténé de 192 et (1,2,3).
De la même manière, multiplier 9 par 1,2,3,4,5 et concaténer donne le numéro numérique panoramique 918273645. Il s'agit du produit concaténé de 9 et (1,2,3,4,5). y a-t-il.
Quel est le plus grand nombre pan-numérique à 9 chiffres obtenu comme produit concaténé d'un entier et (1,2, ..., n) (n> 1)? http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2038
Tout d'abord, j'ai créé un générateur qui génère un nombre spécifié de nombres numériques pan (chaînes de caractères) à partir d'un ensemble spécifié de nombres.
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
Pour générer un générateur avec un numéro numérique panoramique à 10 chiffres qui n'inclut pas 0 au début, spécifiez ce qui suit. Si seq2 est omis, seq1 est copié dans seq2.
pandigital(digit=10,seq1=range(1,10),seq2=range(0,10))
Je pense que ce générateur renvoie les valeurs dans l'ordre croissant si vous passez la plage (1,10), et renvoie les valeurs dans l'ordre décroissant si vous passez la plage (10,1, -1).
Pour répondre à cette question, créez d'abord un ensemble de nombres pan-numériques à 9 chiffres, PAND_SET, en utilisant la fonction ci-dessus. Plus tard, afin de déterminer si d'autres nombres sont inclus dans cet ensemble de nombres numériques panoramiques, set () est utilisé ici pour en faire un objet de type défini en tenant compte de la vitesse de référence.
Ensuite, bouclez i de 2 à 10 000 et effectuez le calcul suivant jusqu'à ce que s soit un nombre à 9 chiffres (chaîne de caractères). s = str (i) + str (i * 2) + str (i * 3) ・ ・ ・
Vérifiez si le s calculé de cette manière est plus grand que le candidat de réponse ans et si s est inclus dans PAND_SET. Si les deux sont vrais, remplacez ans par 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