数据结构day3.1二分法以及幂乘法

二分法思路

已知有0~100内的自然数,如何使用计算机进行查找输入后相应的位置,需要记录下查询的步骤数。

  1. 顺序查找

    问题:如果输入71而我们需要单个查询,记录下来就是72步显然时间复杂度有点问题

  2. 二分法

    设置左右边界,在二分的过程中判断(伪在线分析的思想)二分后的结果是作为左边界还是右边界

    每一次都从每一次的一半来判断

    #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;
    }
    

    幂乘法

    1. 常规x*x

      问题:如果出现x的71次方该如何解决?

      对我们的时间就会有损坏

    2. 运用到二分思想

      幂次是奇数的时候我们可以这样处理

      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;
    }
    

队列笔记已经做完后续整理估计明天发,差点这个就没按照约定了哈哈

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

艾米莉亚小汉堡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值