以字符串的形式给出 n , 以字符串的形式返回n的最小 好进制,如果n的k(k>=2) 进制数的所有数位全为1,则称 k(k>=2) 是n的一个好进制 。
思路:
假设k为n的最小好进制,则一定满足以下条件:
(1)1+k*1 + k^2 +...+k^m = n
根据上面的式子可以知道k^m<n;
(2)由二项式公式:(x+y)^n = c(n,0)y^0*x^n + c(n,1)y^1*x^(n-1) + ...
因此(k+1)^m = c(n,0)k^0 + c(n,1)k^1 + c(n,1)k^2 + ... + c(n,n)k^m
所以n<(k+1)^m
联立(1)(2)得出的结论,可得k^m<n<(k+1)^m,即k<n^(-m)<(k+1)
long long型的数最多为2^64-1,所以可枚举m最大为60看k为多少。
实现代码如下:
string smallestGoodBase(string n) {
long long x = stol(n);
for(int i = 60; i>=2; i--) { //i来遍历m
long long k = pow(x, 1.0/(1.0*i));
long long sum = 1;
long long tmp = 1;
if(k == 1) continue;
for(int j = 1; j<=i; j++) {
tmp = tmp*k;
sum += tmp;
}
if(sum == x) return to_string(k);
}
return to_string(x-1);
}