2011-01-28 16 views
8

Si a = 15 y 152 se representa como a2 mientras 215 se representa como 2a entonces un número x tiene que ser encontrado tal queresolver eficazmente un problema letras/números en Python

8x = 8*x8

probé este Python ingenua código

>>> i = 0 
>>> while(i<=100000000000000000): 
... if(int("8"+str(i))==8*int(str(i)+"8")): 
...  break 
... i = i+1 
... print i 

pero está tardando una gran cantidad de tiempo para producir un resultado correcto.

¿Cómo optimizar el código?

+1

No trate de optimizar el código que tiene actualmente. Use otro algoritmo en su lugar. – Sjoerd

+0

¿Puede sugerir qué algoritmo debe usarse? –

Respuesta

10

Un poco de matemáticas ayuda aquí: Vamos x ser un número natural n con dígitos. Entonces 8x = 8 * 10^n + x, y x8 = 10 * x + 8. Entonces la ecuación a ser resuelta es 8 * 10^n + x = 8 * (10 * x + 8) = 80 * x + 64 , donde x y n deben ser números naturales. Sigue inmediatamente que x = (8 * 10^n - 64)/79. Ahora solo tenemos que verificar cuál de los números de la forma 8 * 10^n - 64 es divisible por 79, que es muy rápido:

>>> n = 0 
>>> while True: 
...  y = 8 * 10**n - 64 
...  if y % 79 == 0: 
...   x = y/79 
...   break 
...  n += 1 
... 
>>> print x 
101265822784 
>>> print int("8"+str(x))==8*int(str(x)+"8") 
True 
+0

Tenga en cuenta que este es el algoritmo más tonto posible. Podría mejorarse mucho (por ejemplo, calculando el siguiente * y * a partir del actual * y * sin calcular el exponencial, calculando la división y el resto al mismo tiempo, etc.), pero obtienes el punto. – Philipp

+0

Y ahora que el algoritmo está simplificado, permítame simplificar la implementación;) 'next ((8 * 10 ** n - 64) para n en el recuento (0) if (8 * 10 ** n - 64)% 79 = = 0) '. – delnan

+0

Muchas gracias por su ayuda. –

1

Debería tratar de deshacerse de las conversiones str to int.

En primer lugar 8*int(str(i)+"8") podría escribir como 8*(i*10+8) y la primera parte podría ser cambiado a 8*(int(log(i)/log(10))+1) + i

Cuestiones relacionadas