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.
class Solution {
public:
string smallestGoodBase(string n)
{
long long num = stoll(n);
for(int i = log(1+num)/log(2)+1;i>2;i--)
{
long long left = 2;
long long right = pow(num,1.0/(i-1))+1;
long long mid;
long long sum;
while(left < right)
{
mid = left + (right - left)/2;
sum = 0;
for(int j=0;j<i;j++)
{
sum = sum*mid +1;
}
if(sum < num) left = mid+1;
else if(sum==num) return to_string(mid);
else right = mid;
}
}
return to_string(num-1);
}
};
我过段时间写注释。