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)
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); } };
浙公网安备 33010602011771号