首页 > 其他 > 详细

LC483. Smallest Good Base

时间:2020-03-20 09:57:25      阅读:46      评论:0      收藏:0      [点我收藏+]

对于给定的正整数n,如果n的k(k >= 2) 进制数的所有数位全为1,则称k是n的一个好进制。

以字符串形式给出n,以字符串形式返回n的最小好进制。

分析:最差的情况,n的n-1进制数为11,n的二进制有$log_{2}n+1$位数,位数越多,进制越小,从$k = log_{2}n+1$位开始查找,

用二分查找求$b + b^1 + b^2 + ... + b^{(k - 1)} = n$的解即可,二分初始区间可以取$[2, n^{\frac{1}{k-1}}]$

class Solution {
public:
    typedef unsigned long long uff;
    string smallestGoodBase(string n) {
        uff num = (uff)stoll(n);
        int maxlen = log(num) / log(2) + 1;
        for (int k = maxlen; k >= 3; --k) {
            uff val = pow(num, 1.0 / (k - 1));
            uff res = bs(val, num, k);
            if (res != 0) return to_string(res);
        }
        return to_string(num - 1);
    }
    
    uff bs(uff val, uff t, int k) {
        uff l = 2, r = val, mid;
        while (l <= r) {
            mid = l + (r - l) / 2;
            uff sum = 1, cur = 1;
            for (int i = 1; i < k; ++i) {
                cur *= mid;
                sum += cur;
            }
            if (sum == t) return mid;
            else if (sum < t) l = mid + 1;
            else r = mid - 1;
        }
        return 0;
    }
};

 

LC483. Smallest Good Base

原文:https://www.cnblogs.com/betaa/p/12529768.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!