1.题目
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.
The range of n is [3, 10^18].
Example 1:
Input: “13”
Output: “3”
Explanation: 13 base 3 is 111.
2.算法
这个题的意思是找到最小基数,那么所得到的全为1的个数肯定最长,我们先找一个比较长的全为1的数,来找一下基数,如果不行则去一个1,在找基数,直到找到为止。m 的取值范围是 [2, log(n, 2)]当m取定时,k的取值范围是
public String smallestGoodBase(String n)
{
long i = Long.parseLong(n);
int maxLong = (int)(Math.log(i) / Math.log(2) + 1);
for (int j = maxLong; j >= 2; j--)
{
int k = find(i, j);
if (k != 0) return k + "";
}
return i - 1 + "";
}
public int find(long i, int l)
{
int ll = 2;
int lr = (int)Math.pow(i, 1.0/l);
while (ll <= lr)
{
int mid = ll + (lr - ll) / 2;
long sum = 0;
int t = 1;
for (int j = 0; j <= l; j++)
{
sum += t;
t *= mid;
}
if (sum == i) return mid;
else if (sum > i) lr = mid - 1;
else ll = mid + 1;
}
return 0;
}
此外还有各种数学方法