#include <iostream> #include <cstdlib> #include <ctime> using namespace std; int main() { srand(time(0));//seed rand 随机种子 //cout<<time(0);//1970年1月1日0时0分0秒到运行程序时经过的秒数 int x=rand()%100+1;//随机数字范围与电脑本身有关,最小0~2^15,最大0~2^31 int c=0; int l=1,r=100; cout<<"本次猜数字:"<<x<<endl; while(l<r){ int mid=(l+r)/2; cout<<"当前数据在:"<<l<<"~"<<r<<",猜测值为:"<<mid<<endl; c++; if(mid==x) break; else if(mid>x) r=mid-1; else l=mid+1; } cout<<"猜了"<<c<<"次"; return 0; } 输入n,输入n个正整数,输入m,查询在这n个正整数中是否存在m 存在输出1,不存在输出0 int n,m,num[10000]; cin>>n; for(int i=1;i<=n;i++){ cin>>num[i]; } cin>>m; int ans=0; for(int i=1;i<=n;i++){ if(num[i]==m){ ans=1; break; } } cout<<ans<<endl; 输入n,输入n个正整数,输入t组数据,每组一个m,查询在这n个正整数中是否存在m 存在输出1,不存在输出0,换行输出t组答案 二分法使用时,答案数据必须是有序的 int n,m,t,num[10000]; cin>>n; for(int i=1;i<=n;i++){ cin>>num[i]; } sort(num+1,num+n+1);//二分法的必须步骤,一定是有序的 cin>>t; while(t--){ cin>>m; int ans=0; int l=1,r=n;//二分法找两端 while(l<r){ //在有数据的范围内 int mid=(l+r)/2; //根据条件缩小范围 if(num[mid]==m){ ans=1; break; } else if(num[mid]>m) r=mid-1; else l=mid+1; } cout<<ans<<endl; } 输入n,输入n个正整数,输入一个m,查询在这n个正整数中是否存在m 存在输出下标,不存在输出-1 int n,m,t; struct Num{ int xb; int a; }num[10000]; bool cmp(Num a,Num b){ return a.a<b.a; } cin>>n; for(int i=1;i<=n;i++){ cin>>num[i].a; num[i].xb=i; } sort(num+1,num+n+1,cmp);//二分法的必须步骤,一定是有序的 cin>>m; int ans=-1; int l=1,r=n;//二分法找两端 while(l<r){ //在有数据的范围内 int mid=(l+r)/2; //根据条件缩小范围 if(num[mid].a==m){ ans=num[mid].xb; break; } else if(num[mid]>m) r=mid-1; else l=mid+1; } cout<<ans<<endl; 输入n,输入n个数字,输入m 输出距离m最近的比m小的那个数字[比m小的最大的数] 如果没有输出-1 输入 5 2 35 7 68 51 40 输出 35 int n,m,num[10000]; cin>>n; for(int i=0;i<n;i++){ cin>>num[i]; } sort(num,num+n); cin>>m; int l=0,r=n-1; while(l<r){ //int mid=(l+r)/2;//num[2]成立 num[3]不成立 避免死循环 int mid=(l+r+1)/2; if(num[mid]<m){ l=mid; } else{ r=mid-1; } } if(num[l]==m) cout<<-1; else cout<<num[l]; 分治算法:二分查找->二分答案->快速排序(递归) 作业:1240必做,1247选做 (责任编辑:admin) |