483. 最小好进制 力扣 数学 hard

题目描述:

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

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

示例 1:

输入:"13"
输出:"3"
解释:13 的 3 进制是 111。 

题源:https://leetcode-cn.com/problems/smallest-good-base/

注意点:

string转longlong:stol(string)   

string转int:stoi(string)

string转float,转double: stof(string), stod(string)

数字类型转string:to_string(num)

开根号(非平方根),pow( , 1.0/m)

题解:  https://leetcode-cn.com/problems/smallest-good-base/solution/zui-xiao-hao-jin-zhi-by-leetcode-solutio-csqn/

unsigned   int     0~4294967295   (10位数,4e9)

int                        -2147483648~2147483647  (10位数,2e9   2^31 - 1)   

long long:           -9223372036854775808~9223372036854775807  (19位数, 9e18 ) 2^63 - 1

unsigned long long:0~18446744073709551615  (20位数,1e19)  2^64 - 1

本题数字可以用longlong存下!

 

class Solution {
public:
    string smallestGoodBase(string n) {
     long long N=stol(n);
     int maxM=(int)(log(N*1.0)/log(2));
     long long k;
     for(int  m=maxM;m>0;m--)
     {
         k=(long long)pow(N,1.0/m);
        // long long s=(1-pow(k,m+1))/(1-k);
         long long s = 1, mul = 1;   // 计算 (11...11)k 对应的十进制值
            for (int i = 1; i <= m; ++i) {
                mul *= k;
                s += mul;
            }

         //printf("m=%d k=%lld s=%lld\n",m,k,s);
         //if(m==6) {printf("%lld\n",pow(k,m+1)); printf("%lld",k-1);}
         
         if (s==N) return to_string(k);
     }
     return to_string(N-1);
    }
};

 

 

 

posted on 2021-06-18 17:06  Yxter  阅读(88)  评论(0)    收藏  举报

导航