LeetCode 483 Smallest Good Base 题解

题意简述:给定一个正整数n,肯定存在基底k(k>2),使n在基底k的表示中所有位都是1,求出所有这样的基底中最小的一个。
输入:一个string,表示正整数n。
输出:一个string,表示满足条件的最小基底k。
示例:对于数13,其在基底3下的表示是111,小于3的基底都不满足,因此输出是3。


题解:
问题用数学描述,就相当于求解方程 n=km+km1+...+k+1 ,不难得到 km<n<(k+1)m ,因此 k<nm<k+1 。于是对于一个特定的m,方程要么没有解,要么只有一个解 k=nm 。而m的范围是知道的,最小为1,最大是满足 nm1 的最大值。因此只需遍历范围内的m,计算当 k=nm 时方程右边是否等于n(注意这里只能用累加的方法,使用等比数列的求和公式 (km+11)/(k1) 的话, km+1 有可能超出long long int的范围,发生溢出使判断发生错误),如果相等证明k是一个解。设置一个变量储存当前最小的k,求出更少的解更新该变量,最后返回该变量即可。

实现的算法复杂度是 O(m) ,实际上采用二分搜索的策略(因为m的范围其实已知)还可以降至 O(log(m))

class Solution {
public:
    string smallestGoodBase(string n) {
        long long ori = stoll(n);
        long long res = ori-1, bits = 2;

        while(1) {
            long long temp = floor(pow(ori, 1.0/bits));
            if(temp <= 1) break;

            long long tempori = 0,tempr = 1;
            for(int i = 0;i <= bits;i++) {
                tempori += tempr;
                tempr *= temp;
            }

            if(ori == tempori)
                res = temp;

            bits++;
        }

        return to_string(res);
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值