//用第一个代码会返回不确定的位置;即当查找这个的书有多个位置,那么返回的值不确定;
/*
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a[10]={0,1,1,1,2,3,4,5,6,7};
int r=0,l=9;
int k=1;
int m;
while(r<l)
{m=r+(l-r)/2;
if(a[m]<k)r=m+1;
else if(a[m]>k)l=m-1;
else break;
}
if(a[m]==k)cout<<m<<endl;
return 0;
}
*/
//第二个代码改进了返回的是这个数出现的第一个位置;
/*
#include <iostream>
using namespace std;
int main()
{
int a[10]={0,1,1,1,2,3,4,5,6,7};
int r=0,l=9;
int k;
cin>>k;
int m;
while(r<l)
{
m=r+(l-r)/2;
if(a[m]<k)r=m+1;
else l=m;
}
cout<<r<<endl;
return 0;
}
//第三个代码返回的是这个数最后出现位置后面的一个位置;;
*/#include <iostream>
using namespace std;
int main()
{
int a[10]={0,1,1,1,2,3,4,5,6,7};
int r=0,l=9;
int k;
cin>>k;
int m;
while(r<l)
{
m=(l-r)/2+r;
if(a[m]<=k)
r=m+1;
else
l=m;
}
cout<<r<<endl;
}
总结小前+1找后面;//a[m]<k,r+1;找的是后面的区域;