https://leetcode-cn.com/problems/smallest-good-base/

思路:由题目可知,最小是2进制,因此其最终结果的好进制最多含有
l
o
g
2
(
n
)
+
1
log_2(n)+1
log2(n)+1个1,考虑到
n
n
n的取值范围,我们最多需要枚举
64
64
64次。当1的个数确定的时候,我们可以二分进制
k
k
k,并计算对应
k
k
k进制数的大小,将其与
n
n
n进行比较,如果相等的话,就更新记录最小的
k
k
k。
class Solution {
public:
using ll=long long;
string smallestGoodBase(string n) {
ll value=stoll(n);
int maxk=(float)(log2(value)+1);
ll ans=value-1;
for(int k=maxk;k>1;k--)
{
ll l=2,r=pow(value,1.0/(k-1)),mid;
while(l<=r)
{
mid=(l+r)>>1;
ll tmp=cal(mid,k);
if(tmp==value)
{
ans=min(ans,mid);
break;
}
else if(tmp<value)
l=mid+1;
else
r=mid-1;
}
}
return to_string(ans);
}
ll cal(ll m,ll k)
{
ll sum=1,base=1;
for(int i=1;i<k;i++)
{
base*=m;
sum+=base;
}
return sum;
}
};

本文介绍了一种解决LeetCode上最小好进制问题的方法。通过确定最大可能的1的数量,利用二分查找来确定最佳的进制基数,从而找到最小的好进制表示。文章详细解释了算法的实现细节。

411

被折叠的 条评论
为什么被折叠?



