483. Smallest Good Base
阿新 • • 發佈:2018-12-13
解法
參考:https://blog.csdn.net/qq_23997101/article/details/73135615
數學推理題…………………………………………
本質是找a和k,使得:
所以有:
又知
即有:
綜上,如果a進位制化後長為k+1,那麼
,就是:
- 為整數時,
- 為非整數時,
當k越大的時候a越小,k最大有多大呢?
當
時,k最大為
的時候,長度為
所以我們現在得到了2條結論:
- k確定時,a怎麼選:
- 為整數時,
- 為非整數時,
- t確定時,應該從哪裡開始搜:
所以演算法如下:
- 初始時,t=2,算出一個長度k,再根據k算出一個a(當然這時a明顯為2)。
- 如果a滿足條件,那麼顯然它是最小的,返回
- 如果a不滿足條件,那下一個k在哪呢?下一個k至少要比當前的k小,並且下一個k算出來的a要大於現在的a,所以有:
有一個坑是k=1的時候算base,明顯base=n-1,但是轉成浮點再轉回整數可能有問題,所以如果最後也沒返回結果,預設返回保底的n-1
程式碼:
class Solution(object):
def smallestGoodBase(self, n):
"""
:type n: str
:rtype: str
"""
n = long(n)
import math
def good_base(n,k):
tmp = math.pow(n,1.0/k)
if abs(long(tmp)-tmp)<10**-6:
return long(tmp)-1
else:
return long(tmp)
def is_good_base(n,k):
if n%k!=1:
return False
if n==1:
return True
return is_good_base((n-1)/k,k)
now = int(math.ceil(math.log(n+1, 2)-1))
while now>=1:
base = good_base(n,now)
if is_good_base(n,base):
return str(base)
now = min(int(math.ceil(math.log(n*base+1, base+1)-1)), now-1)
return str(n-1)