2011-01-28 13 views
8

Jeśli a = 15 i 152 jest reprezentowany jako a2 podczas 215 jest reprezentowany jako 2a wtedy liczba x należy znaleźć taki, żeWydajne rozwiązanie problemu litera/numer w Pythonie

8x = 8*x8

Próbowałem to naiwny Python kod

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

, ale uzyskanie prawidłowego wyniku zajmuje dużo czasu.

Jak zoptymalizować kod?

+1

Nie staramy się optymalizować kodu masz obecnie. Zamiast tego użyj innego algorytmu. – Sjoerd

+0

Czy możesz zaproponować, który algorytm ma być użyty? –

Odpowiedz

10

Pomaga tutaj trochę matematyki: Niech numer x będzie liczbą naturalną z cyframi n. Następnie 8x = 8 * 10^n + x, i x8 = 10 * x + 8. Zatem równanie do rozwiązania to 8 * 10^n + x = 8 * (10 * x + 8) = 80 * x + 64 , gdzie in ma być liczbami naturalnymi. Natychmiast wynika, że ​​x = (8 * 10^n - 64)/79. Teraz musimy tylko sprawdzić, który z numerów formularza 8 * 10^n - 64 jest podzielny przez 79, który jest bardzo szybki:

>>> 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

Zauważ, że jest to najgłupszy z możliwych algorytmów. Mogłoby to być znacznie poprawione (np. Przez obliczenie następnego * y * z bieżącego * y * bez obliczania wykładniczego, dzielącego i pozostałego w tym samym czasie itd.), Ale dostajesz punkt. – Philipp

+0

A teraz, gdy algorytm jest uproszczony, pozwól mi uprościć implementację;) 'next ((8 * 10 ** n - 64) dla n w zliczeniu (0) jeśli (8 * 10 ** n - 64)% 79 = = 0) '. – delnan

+0

Dzięki za pomoc. –

1

Powinieneś spróbować pozbyć się konwersji int do int.

Przede wszystkim 8*int(str(i)+"8") można zapisać jako 8*(i*10+8) i pierwsza część może zostać zmieniona na 8*(int(log(i)/log(10))+1) + i

Powiązane problemy