二分法思路
已知有0~100内的自然数,如何使用计算机进行查找输入后相应的位置,需要记录下查询的步骤数。
-
顺序查找
问题:如果输入71而我们需要单个查询,记录下来就是72步显然时间复杂度有点问题
-
二分法
设置左右边界,在二分的过程中判断(伪在线分析的思想)二分后的结果是作为左边界还是右边界
每一次都从每一次的一半来判断
#include <stdio.h> #define Max 100 void divfont(int z){ int s=0,su,n=0,b;//b是用于作为左右边界的交换值 s是左边界初始化为0 su是右边界 su=Max;//有边界的初始化 b=su/2;//第一次的判断值 n++;//第一次调用 while (z!=b){//判断寻找 if (z>b){//更换左边界 b++; s=b; b=(s+su)/2; n++;//记录 } if (z<b){//更换右边界 su=b; b=(s+su)/2; n++; } if (b==su&&b==s){ printf("已经经过了%d次找不到!",n); return; } } printf("这个是次数:%d 这个是数字是多少:%d",n,b); } int main(){ int a; scanf("%d",&a); divfont(a);//要查询的数字是多少 return 0; }
幂乘法
-
常规x*x
问题:如果出现x的71次方该如何解决?
对我们的时间就会有损坏
-
运用到二分思想
幂次是奇数的时候我们可以这样处理
pow(x*****x,n/2)*x;
幂次是偶数的时候我们可以这样处理
pow(x*x,n/x);
#include <stdio.h> #include <math.h> double m(double a,int b){//a是需要乘的数字,b是几次方 double s; if (b%2==0){ s=pow(a*a,b/2); } else{ s=a*pow(a*a,b/2); } return s; } int main(){ int b; double a; scanf("%lf%d",&a,&b); printf("\n%.0lf",m(a,b)); return 0; }
-
队列笔记已经做完后续整理估计明天发,差点这个就没按照约定了哈哈