¿Cuál es el mejor algoritmo para encontrar el número más pequeño (mínimo 40 dígitos) cuyo último dígito se mueve al frente y es nueve veces el número original?

La forma en que abordé este problema es la siguiente:
Deje z ser el número dado. Entonces podemos escribir z como:

[matemáticas] z = 10 * x + y [/ matemáticas]

donde y [matemáticas] \ en [/ matemáticas] [1,9].
Digamos que el número mínimo es de k dígitos donde k> = 40.
Podemos formular la condición mencionada en la pregunta de la siguiente manera:

(10 * x + y) * 9 = y * [matemáticas] 10 ^ {k-1} [/ matemáticas] + x
89 * x = y * ([matemáticas] 10 ^ {k-1} [/ matemáticas] – 9)

Como y no puede dividir 89, entonces ([matemática] 10 ^ {k-1} [/ matemática] – 9) debería dividir 89.
Escribí un código simple de Python para encontrar el valor de k .

para i en xrange (39,100):
if (pow (10, i) – 9)% 89 == 0:
potencia = i
descanso
poder de impresión

El bucle se rompe a la potencia = 43.
Como ambos números (lhs y rhs) tienen los mismos dígitos, el valor de y debería ser 9. x puede calcularse a partir de

x = (y * ([matemáticas] 10 ^ {k-1} [/ matemáticas] – 9)) / 89

Entonces el número z es

(([matemáticas] 10 ^ {potencia} [/ matemáticas] -9) / 89) * 9 * 10 + 9

Podemos encontrar la solución final como:

imprima “número final es”, ((pow (10, power) -9) / 89) * 9 * 10 + 9

La respuesta que muestra es: 10112359550561797752808988764044943820224719
He verificado la solución:

imprimir 9 * 10112359550561797752808988764044943820224719 == 91011235955056179775280898876404494382022471
imprimir len (“10112359550561797752808988764044943820224719”)

e imprime True y 44. Esto muestra que la solución es correcta y de 44 (> 40) dígitos.


Desde que usé Python no me preocupé mucho por el tipo de almacenamiento. Si tuviera que codificarlo en Java, usaría BigInt Library y en C ++ podría haber creado una plantilla para la división / multiplicación / adición de BigInt o utilizar las otras bibliotecas de BigInt (ver referencias) y vincularlo con mi código para resolver esta pregunta .
Para las bibliotecas C ++ BigInt, consulte : Biblioteca C ++ Big Integer, clase C ++ BigInt