1. 程式人生 > >483.最小好進位制

483.最小好進位制

對於給定的整數 n, 如果n的k(k>=2)進位制數的所有數位全為1,則稱 k(k>=2)是 n 的一個好進位制

以字串的形式給出 n, 以字串的形式返回 n 的最小好進位制。

示例 1:

輸入:"13"
輸出:"3"
解釋:13 的 3 進位制是 111。

示例 2:

輸入:"4681"
輸出:"8"
解釋:4681 的 8 進位制是 11111。

示例 3:

輸入:"1000000000000000000"
輸出:"999999999999999999"
解釋:1000000000000000000 的 999999999999999999 進位制是 11。

提示:

  1. n的取值範圍是 [3, 10^18]。
  2. 輸入總是有效且沒有前導 0。

class Solution {
public:
    string smallestGoodBase(string n) {
        long long num = stol(n);
        for (int i = log(num + 1) / log(2); i >= 2; --i) {
            long long left = 2, right = pow(num, 1.0 / (i - 1)) + 1;
            while (left < right) {
                long long mid = left + (right - left) / 2, sum = 0;
                for (int j = 0; j < i; ++j) {
                    sum = sum * mid + 1;
                }
                if (sum == num) return to_string(mid);
                else if (sum < num) left = mid + 1;
                else right = mid;
            }
        }
        return to_string(num - 1);
    }
};