有关题目
对于给定的整数 n, 如果n的k(k>=2)进制数的所有数位全为1,则称 k(k>=2)是 n 的一个好进制。
以字符串的形式给出 n, 以字符串的形式返回 n 的最小好进制。
示例 1:
输入:"13"
输出:"3"
解释:13 的 3 进制是 111。
示例 2:
输入:"4681"
输出:"8"
解释:4681 的 8 进制是 11111。
示例 3:
输入:"1000000000000000000"
输出:"999999999999999999"
解释:1000000000000000000 的 999999999999999999 进制是 11。
提示:
n的取值范围是 [3, 10^18]。
输入总是有效且没有前导 0。
题解
法一:数学
参考官方题解



class Solution {
public:
string smallestGoodBase(string n) {
long nVal = stol(n);//参数提供的字符串转换为long int
int mMax = floor(log(nVal) / log (2));//y = floor(x)。则y等于:不大于x的最大整数。
for (int m = mMax; m > 1; m--)//根据对数函数的单调性,这边k其实就是从 2开始从小到大
//寻找满足条件的最小好进制
{
int k = pow(nVal,1.0 / m);
long mul = 1,sum = 1;//sum = 1把最后一位1包含进去了
for (int i = 0; i < m; i++)
{
mul *= k;//计算出最后一位1外其他位之和
sum += mul;
}
if (sum == nVal)
return to_string(k);
}
//m = 1 直接返回 k = n - 1;
return to_string(nVal - 1);
}
};

本文介绍了一种求解给定整数最小好进制的方法。对于任意整数n,若其在某进制下的表示全为1,则该进制为n的好进制。文章通过数学方法实现了一个算法,用于找出n的最小好进制,并提供了具体的实现代码及示例。
354

被折叠的 条评论
为什么被折叠?



