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);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

幸愉信奥

谢谢亲的支持,我会继续努力啦~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值