El mayor número mágico es $903125$. Para comprobar esto, eliminar el dígito izquierdo repetidamente.
Hay $326$ no triviales (multi-dígito) mágico de los números, y atravesar todos ellos por una simple búsqueda en profundidad requiere comprobación $11982$ divisibilidad de las relaciones. Si usted encuentra algunos accesos directos, usted puede ser capaz de reducir el trabajo a un par de miles de pasos. Yo todavía no hacerlo a mano!
He aquí algunos breves código de Python:
num_trials = 0
stack = [str(digit) for digit in range(1, 10)]
parents = {}
while stack:
x = stack.pop()
for position in range(len(x) + 1):
for digit in range(10):
if str(digit) not in set(x):
y = x[:position] + str(digit) + x[position:]
if y not in parents:
num_trials += 1
if int(y) % int(x) == 0:
parents[y] = x
stack.append(y)
numbers = sorted(set(int(s) for s in parents))
print 'Performed %d modulo operations.' % num_trials
print 'Found %d magical numbers.' % len(numbers)
print 'Examples:', ', '.join(str(x) for x in reversed(numbers) if x >= 10000)
lineage = [str(numbers[-1])]
while lineage[-1] in parents:
lineage.append(parents[lineage[-1]])
print 'Lineage of the winner:', ' <- '.join(lineage)
Salida:
Performed 11982 modulo operations.
Found 326 magical numbers.
Examples: 903125, 803125, 703125, 609375, 603125, 403125, 180625, 146250, 93750, 91250, 90625, 90375, 90125, 81250, 80625, 80125, 71250, 70625, 70125, 63750, 61250, 60375, 60125, 41250, 40625, 40125, 31250, 30625, 30125, 24750, 16250, 14625, 10625
Lineage of the winner: 903125 <- 03125 <- 3125 <- 125 <- 25 <- 5
Edit: Por los comentarios, si usted no permitir ceros a la izquierda exigiendo y[0] != '0'
, entonces hay menos candidatos para trabajar a través de:
Performed 6156 modulo operations.
Found 227 magical numbers.
Examples: 146250, 93750, 91250, 81250, 71250, 63750, 61250, 41250, 31250, 24750, 16250, 14625
Lineage of the winner: 146250 <- 16250 <- 1250 <- 250 <- 50 <- 5
Edit 2: Para un ejemplo de un "truco" que reduce la mano de obra, vamos a aplicar miracle173 de la Observación 1, el uso de este código para rescatar a los del bucle interno:
if len(x) >= 3:
if position == len(x):
if digit != 0:
continue
elif position > 1:
continue
Este cambio reduce a la mitad la cantidad de trabajo. Ahora toma $3447$ modulo operaciones para hallar el $227$ mágico de los números hasta el $146250$, o permitir que los ceros a la izquierda, $6120$ modulo operaciones para hallar el $326$ mágico de los números hasta el $903125$.