问题描述:
大家一定都能熟练掌握二分查找啦!那么来计算二分的次数吧!约定二分的中点mid = (left + right) / 2。
输入:
第一行输入一个整数N(N<=10000)。
第二行输入N个升序整数。第三行输入一个待查找的整数(必定在第二行中出现过)。
输出:
输出二分查找该整数时,进行过多少次二分。
输入样例:
输入1:
5
18 53 54 74 99
53
输出1:
2
输入2:
7
0 1 2 3 4 5 6
5
输出2:
1
思路:
题中要求二分的次数,即就是把数组一分为二的次数,而不是循环次数。样例1中把数组分了两次之后mid值等于x,样例2数组分了一次就找到mid==x。因此在每一次更新左右边界时更新次数即可。
#include <cstdio>
const int maxn = 10010;
int a[maxn];
int main(){
int n, x;
scanf("%d", &n);
for(int i = 0; i < n; i++){
scanf("%d", &a[i]);
}
scanf("%d", &x);
int left = 0, right = n - 1;
int mid, ans = 0;
while(left <= right){
mid = (left + right) / 2;
if(a[mid] == x)
break;
else if(a[mid] > x){
right = mid - 1;
ans++;
}
else{
left = mid + 1;
ans++;
}
}
printf("%d", ans);
return 0;
}