这道题目的前提条件是输入的时候按升序排列,解法里没有包括排序,用二分搜索需要先进行排序,自行了解高等排序法
# include <iostream>
using namespace std;
#define MAX 10001
int x[MAX];
int efsearch(int n,int key){
int m,l,r;
l=0;
r=n;
while(l<r){//这里我最开始写的条件是l!=r,后来发现改成l<r比较好
m=(l+r)/2;
if(x[m]==key) return 1;
else if(key<x[m]) r=m;
else if(key>x[m]) l=m+1;
}
return 0;
}
int main()
{
int n;
cin>>n;
int i;
for(i=0; i<n; i++){
cin>>x[i];
}
int q;
cin>>q;
// int a[MAX];
int a;
int b=0;
for(i=0; i<q; i++){
cin>>a;
b+=efsearch(n,a);
}
cout<<b;
return 0;
}
---------------------------------------------------------------------------------------------------------分割线
递归实现
# include <iostream>
using namespace std;
# define MAX 1000001
int A[MAX];
int n;
int erfen(int left,int right,int key){
int l,r,m;
l=left;r=right;
if(l>=r) return 0;
m=(l+r)/2;
if(key<A[m]){
r=m;
if(erfen(l,r,key)) return 1;
}
else if(key==A[m]) return 1;
else if(key>A[m]){
l=m+1;
if(erfen(l,r,key)) return 1;
}
return 0;
}
int main()
{
cin>>n;
int i;
for(i=0; i<n; i++){
cin>>A[i];
}
int x;
cin>>x;
int key;
int count=0;
for(i=0; i<x; i++){
cin>>key;
if(erfen(0,n,key)) count++;
}
cout<<count;
return 0;
}