如果a = 15
和152
表示为a2
而215
表示为2a
,则必须找到数字x,以便
8x = 8*x8
我尝试了这个天真的Python代码
>>> i = 0
>>> while(i<=100000000000000000):
... if(int("8"+str(i))==8*int(str(i)+"8")):
... break
... i = i+1
... print i
但是要花费大量时间才能产生正确的结果。
如何优化代码?
答案 0 :(得分:10)
这里的一些数学帮助:让 x 成为 n 位的自然数。然后8x = 8 * 10 ^ n + x,并且x8 = 10 * x + 8.因此要求解的等式是8 * 10 ^ n + x = 8 *(10 * x + 8)= 80 * x + 64 ,其中 x 和 n 必须是自然数。紧接着x =(8 * 10 ^ n - 64)/ 79.现在我们只需要检查8 * 10 ^ n - 64形式的哪个数字可被79整除,这非常快:
>>> 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
答案 1 :(得分:1)
您应该尝试摆脱str到int转换。
首先,8*int(str(i)+"8")
可以写成8*(i*10+8)
,第一部分可以更改为8*( int(log(i)/log(10))+1) + i