Leetcode 483 最小好进制

最小好进制题目链接
题目大意
对于给定的整数 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 kmn(k+1)m
k ≤ n − m ≤ ( k + 1 ) k \leq n^{-m} \leq (k+1) knm(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 x1

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);
    }
};

猜你喜欢

转载自blog.csdn.net/Edviv/article/details/111085315