力扣 483. 最小好进制 二分

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

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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值