#include<stdio.h> #include<math.h> int findMin(int n) {//左闭右开 int l = 1, r = 2e9;//2E9表示INT_MAX while (l < r) { int mid = (r - l) / 2 + l;//这里为了避免越界问题mid+(l+r)/2,写成我那样 if (mid * log10(mid) +1< n) { l = mid + 1; } else { r = mid; } } return l; } int main() { int n; scanf("%d", &n); int result = findMin(n); printf("%d", result); return 0; } //左闭右闭 //int findMin(int n) { // int l = 1, r = 2e9-1; // while (l <= r) { // int mid = (r - l) / 2 + l; // if (mid * log10(mid) +1< n) { // l = mid + 1; // } // else { // r = mid-1; // } // } // return l; //}
ps:
1.有些编译器可能没有math的库函数log10,所以需要用到换底公式。
2.求一个数是多少位,有一个方法如下图,log10x的x次方,把x次幂提到前面,就是x乘以log10x+1,比如100是三位数,log10(100)=2,2+1=3,所以是三位数
3.以防越界问题没懂的话请看carl的视频,链接在下面
5.
这道题使用二分法的原因是,我们要找到一个最小的正整数 x,使得 x^x 的位数达到或超过给定的 n。通过观察,我们知道 x 是一个递增函数,即 x 越大,x^x 的值越大。
使用二分法的关键在于,我们可以通过检查 x 的中间值来确定我们应该在哪一侧继续搜索。如果 mid * log10(mid) < n,那么说明 mid 还不够大,我们需要在 mid 的右侧搜索;否则,说明 mid 可能太大,我们需要在 mid 的左侧搜索。
这样,通过二分法,我们能够在每次迭代中缩小搜索范围,快速找到满足条件的最小正整数 x。由于 x 是递增的,因此在找到一个满足条件的 x 后,就可以确保它是最小的。
总的来说,使用二分法可以有效地加速搜索过程,减少不必要的计算,从而更高效地找到满足条件的最小正整数 x。
这是左闭右闭,r=numsize-1
这是左闭右开
链接在此:Carl很强,大家多向他学习!!!