C++之——分治(2)+快速幂

1 篇文章 0 订阅
1 篇文章 0 订阅

二分&&分治

一维数组的查找操作,就是在一维数组中查找有没有某个元素,它的值等于指定的值 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=(3
3)(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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
分步图
在这里插入图片描述
核心代码在这里插入图片描述

可以来道题练手

在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值