最小好进制

以字符串的形式给出 n , 以字符串的形式返回n的最小 好进制,如果n的k(k>=2) 进制数的所有数位全为1,则称 k(k>=2) 是n的一个好进制 。

思路:

假设k为n的最小好进制,则一定满足以下条件:

(1)1+k*1 + k^2 +...+k^m = n

根据上面的式子可以知道k^m<n;

(2)由二项式公式:(x+y)^n = c(n,0)y^0*x^n + c(n,1)y^1*x^(n-1) + ...

因此(k+1)^m = c(n,0)k^0 + c(n,1)k^1 + c(n,1)k^2 + ... + c(n,n)k^m

所以n<(k+1)^m

联立(1)(2)得出的结论,可得k^m<n<(k+1)^m,即k<n^(-m)<(k+1)

long long型的数最多为2^64-1,所以可枚举m最大为60看k为多少。

实现代码如下:

string smallestGoodBase(string n) {  
    long long x = stol(n);
    for(int i = 60; i>=2; i--) { //i来遍历m 
        long long k = pow(x, 1.0/(1.0*i));
        long long sum = 1;
        long long tmp = 1;
        if(k == 1) continue;
        for(int j = 1; j<=i; j++) {
            tmp = tmp*k;
            sum += tmp;
        }
        if(sum == x) return to_string(k);
    }
    return to_string(x-1);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值