最小好进制题目链接
题目大意
对于给定的整数 n n n, 如果 n n n 的 k k k( k > = 2 k>=2 k>=2)进制数的所有数位全为1,则称 k k k( k > = 2 k>=2 k>=2)是 n n n 的一个好进制。
以字符串的形式给出 n n n, 以字符串的形式返回 n n n 的最小好进制。
样例解释
输入:"13"
输出:"3"
解释:13 的 3 进制是 111。
k 0 + k 1 + k 2 + ⋯ + k m = n k^0 +k^1 + k^2 + \dots + k^m = n k0+k1+k2+⋯+km=n
放缩法放缩一下 k m ≤ n ≤ ( k + 1 ) m k^m \leq n \leq (k+1)^m km≤n≤(k+1)m
k ≤ n − m ≤ ( k + 1 ) k \leq n^{-m} \leq (k+1) k≤n−m≤(k+1)
已知 n, 2 10 2^{10} 210 约等于 1 e 3 1e^3 1e3, 1 e 18 1e^{18} 1e18 大概枚举到60即可,首先将字符 s t r i n g string string 转换成 l o n g long long l o n g long long类 型 x x x,然后计算一下 k k k 进制,如果等于目标值 x x x,则返回 k k k,否则返回 x − 1 x-1 x−1
class Solution {
public:
string smallestGoodBase(string n) {
long long x = stol(n); //string 类型转换成整型
for(int i = 2; i <= 60; i++){
//枚举长度
long long k = pow(x,1.0/(1.0*i)); //"K"进制
if(k == 1) continue; //没有1进制
long long sum = 0; //存储当前和
long long now = 0; //存储当前 "K"进制的值
for(int j = 0; j <= i; j++){
//枚举长度
if(!j) now = 1;
else now *= k;
sum += now;
}
if(sum == x) return to_string(k);
}
return to_string(x-1);
}
};