LC483. Smallest Good Base

对于给定的正整数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;
    }
};

 

上一篇:经济学人精读笔记18: 为什么越来越多中国人想要移居海外?


下一篇:python中字符串相关运算