二分&&分治
一维数组的查找操作,就是在一维数组中查找有没有某个元素,它的值等于指定的值 x。查找操作的结果可能是一个没找到、找到一个或者找到很多个。常见的查找算法有“顺序”查找和“二分”查找。
顺序查找就是按照从前往后的顺序,将数组中的元素依次与要查找的数 x 进行比较。
二分查找又称“折半”查找,其优点是比较次数少、查找速度快。但是要求数据是递增或递减排序的。
二分查找模板
int left = 0,right = n - 1;
int find = n;//find标记找到的位置,初始化为n,表示没找到
while(left <= right){
int mid = (left + right) / 2;
if(a[mid] == x){//找到了,就标记位置,并退出循环
find = mid;
break;
}
if(x < a[mid]) right = mid - 1;//x只能在左半部分
if(a[mid] < x) left = mid + 1; //x只能在右半部分
}
if(find != n) printf("%d\n",find);
else printf("not find\n");
1.【问题描述】
公司举办年会,为了活跃气氛,设置了摇奖环节。参加聚会的每位员工都有一张带有号码的抽奖券。现在,主持人依次公布 n 个不同的获奖号码,小谢看着自己抽奖券上的号码 num,无比紧张。请编写一个程序,如果小谢获奖了,请输出他中的是第几个号码;如果没有中奖,请输出 0。
【输入格式】
第一行一个正整数 n,表示有 n 个获奖号码,2<n≤100。
第二行包含 n 个正整数,之间用一个空格隔开,表示依次公布的 n 个获奖号码。
第三行一个正整数 num,表示小谢抽奖券上的号码。
1≤获奖号码,num<10000。
这道题sort就可以做出来;
但数据大的话就不一定;
【输出格式】
一行一个整数,如果小谢中奖了,表示中奖的是第几个号码;如果没有中奖,则为 0。
【输入样例】
7
17 2 3 4 9555 6 1
3
【输出样例】
3
参考代码
快速幂
3^10=3333333333
//尽量想办法把指数变小来,这里的指数为10
3^10=(33)(33)(33)(33)(33)
310=(3*3)5
310=95
95=(94)(9^1)
95=(812)(9^1)
95=(65611)(9^1)
//此时,我们发现指数又变成了一个奇数1,按照上面对指数为奇数的操作方法,应该抽出了一个底数的一次方,这里即为65611,这个65611我们先单独移出来,但是此时指数却变成了0,也就意味着我们无法再进行“缩指数”操作了。
95=(65610)(91)*(65611)=1*(91)*(65611)=(91)*(65611)=9*6561=59049
模mu 板
分步图
核心代码
可以来道题练手