For an integer n, we call k>=2 a good base of n, if all digits of n base k are 1.
Now given a string representing n, you should return the smallest good base of n in string format.
Example 1:
Input: "13" Output: "3" Explanation: 13 base 3 is 111.
Example 2:
Input: "4681" Output: "8" Explanation: 4681 base 8 is 11111.
Example 3:
Input: "1000000000000000000" Output: "999999999999999999" Explanation: 1000000000000000000 base 999999999999999999 is 11.
Note:
- The range of n is [3, 10^18].
- The string representing n is always valid and will not have leading zeros.
参考资料:here。
这道题的思路比较简单,但是需要注意数据的准确性以及边界问题。
class Solution {
public:
string smallestGoodBase(string n) {
long long num = stoll(n);
int m_top = int(log(num + 1) / log(2)) + 1;
for (int m = m_top; m >= 2; m--) {
long long k_top = pow(num, 1 / (double(m) - 1));
long long k_bottom = 2;
while (k_bottom <= k_top) {
long long k_mid = (k_bottom + k_top) / 2;
long long tmp = 0;
for (int i = 0; i < m; i++) {
tmp = tmp * k_mid + 1;
}
if (tmp == num) {
return to_string(k_mid);
}
else if (tmp > num) k_top = k_mid - 1;
else k_bottom = k_mid + 1;
}
}
return to_string(num - 1);
}
};