《LeetCode之每日一题》:64.最小好进制

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

这里写目录标题

有关题目

对于给定的整数 n, 如果n的k(k>=2)进制数的所有数位全为1,则称 k(k>=2)是 n 的一个好进制。

以字符串的形式给出 n, 以字符串的形式返回 n 的最小好进制。
示例 1:

输入:"13"
输出:"3"
解释:133 进制是 111
示例 2:

输入:"4681"
输出:"8"
解释:46818 进制是 11111
示例 3:

输入:"1000000000000000000"
输出:"999999999999999999"
解释:1000000000000000000999999999999999999 进制是 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);
    }
};

在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值