最小好进制题目链接
题目大意
对于给定的整数
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);
}
};