• 鹏哥C语言36-37---循环/分支语句练习(折半查找算法)


    #define _CRT_SECURE_NO_WARNINGS
    //----------------------------------------------------------------------------------------------------3.4 分支,循环练习
    //用代码解决问题=先想办法(编程思维)+再写代码(按照语法形式)

    //----------------------------------------------------------------------------------------------------3.4.1. 练习参考代码

    #include <stdio.h>
    //-----------------------------------------------------------------------------------------1.计算n的阶乘
    //---------------------------------------------------while
    //int main()
    //{
    //    int n = 0;
    //    int i = 1;
    //    int ret = 1;
    //    scanf("%d", &n);
    //
    //    while (i <= n)
    //    {
    //        ret = ret * i;
    //        i++;
    //    }
    //    printf("%d", ret);
    //
    //    return 0;
    //}

    //---------------------------------------------------for

    //int main()
    //{
    //    int n = 0;
    //    int i = 1;
    //    int ret = 1;
    //    scanf("%d", &n);
    //
    //    for (i = 1; i <= n; i++) 不考虑溢出问题
    //    {
    //        ret = ret * i;
    //    }
    //    printf("%d", ret);
    //
    //    return 0;
    //} 

    //-----------------------------------------------------------------------------------------2.计算1!+2!+3!+......+10!

    // --------------------------------两个 for 循环嵌套效果较差,每次内部循环都重复
    //int main()
    //{
    //    int n = 0;
    //    int i = 1;
    //    int ret = 1;
    //    int ADD = 0;
    //
    //    for(n=1;n<=3;n++)
    //    {
    //        ret = 1; // 每次内部循环的时候,必须给 ret 初始化
    //        for (i = 1; i <= n; i++) 
    //        {
    //            ret = ret * i;
    //        }
    //        ADD = ADD + ret;//   自己老是忘记这个迭代的格式!!!!!!!
    //    }
    //    printf("%d", ADD);
    //
    //    return 0;
    //} 

    // ---------------------------------------------优化
    //int main()
    //{
    //    int n = 0;
    //    int ret = 1;
    //    int ADD = 0;
    //
    //    for (n = 1; n <= 3; n++)
    //    {
    //            ret = ret * n;
    //        ADD = ADD + ret;
    //    }
    //    printf("%d", ADD);
    //
    //    return 0;
    //}

    //--------------------------------------------------------------------------------3.从数组中查找数(折半查找算法)
    //在一个有序的数组中查找具体的数字

    //--------------------------------------------------一个一个找,效率慢
    //int main()
    //{
    //    int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
    //    int k = 0;
    //    scanf("%d", &k);
    //    int i = 0;
    //    int size = sizeof(arr) / sizeof(arr[0]); //  求数组内元素个数,用了好几遍了
    //    for(i=0;i<=size;i++)
    //    {
    //        if (arr[i] == k)
    //        {
    //            printf("找到了,下标是:%d", i);
    //            break;
    //        }
    //    }
    //    if (i >= size)
    //        printf("找不到");
    //
    //    return 0;
    //}

    //---------------------------------------------------折半查找算法(二分查找)
    //代码麻烦,但是效率高,速度快,限制是只能应用于有序数组

    /*

    int main()
    {
        int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
        int k = 0;
        scanf("%d", &k);
        int i = 0;
        int size = sizeof(arr) / sizeof(arr[0]); 
        int left = 0;
        int right = size - 1;
        
        while(left<=right)
        {
            int mid = (left + right) / 2;
            if (arr[mid] < k)
            {
                left = mid + 1;
            }
            else if (arr[mid] > k)
            {
                right = mid - 1;
            }
            else
            {
                printf("找到了,下标是:%d", mid);
                break;
            }
        }
        if (left > right)
        {
            printf("找不到");

        }
        return 0;
    }

    */

    //---------------------------------------------------------------------------3.4.2 从数组中查找数(折半查找算法)
    //在一个  有序  的数组中查找具体的数字

    //-----------------------------------------------------------------------------折半查找算法(二分查找)
    // 每次查找缩小一半范围
    //代码麻烦,但是效率高,速度快,限制是只能应用于有序数组

    //int main()
    //{
    //    int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
    //    int k = 0;
    //    scanf("%d", &k);
    //    int i = 0;
    //    int size = sizeof(arr) / sizeof(arr[0]);//求元素个数
    //    int left = 0;
    //    int right = size - 1;
    //
    //    while (left <= right) // 关键二:一定是 <=
    //    {
    //        int mid = (left + right) / 2; // 关键一: 中间值mid  计算 一定要在循环里边
    //        //如果 left + right 的值超出了 int 整型所能表达的最大值,会产生位溢出,求得的平均值会不准确
    //        // int mid=left+(left+right)/2;  //就避免溢出的问题
    //        if (arr[mid] < k)
    //        {
    //            left = mid + 1;
    //        }
    //        else if (arr[mid] > k)
    //        {
    //            right = mid - 1;
    //        }
    //        else
    //        {
    //            printf("找到了,下标是:%d", mid);
    //            break;
    //        }
    //    }
    //    if (left > right)
    //    {
    //        printf("找不到");
    //
    //    }
    //    return 0;
    //}

    //-----------------------------------------------------------------------------------------4.从两端移动,向中间汇聚
    //编写代码,演示多个字符从两端移动,向中间汇聚
    //welcome to bit!!!
    //###############
    //w#############! 
    //we###########!!
    //......
    //welcome to bit!!!

    #include
    #include
    //
    //int main()
    //{
    //    //  int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; //整型数组
    //    char arr1[] = "welcome to bit!!!"; //字符数组
    //    char arr2[] = "#################";
    //
    //    int left = 0;
    //    int right = strlen(arr1); //strlen  求字符串长度,求的是\0之前的元素个数,
    //    //int right = sizeof(arr1) / sizeof(arr1[0])-2; //先减去 \0, 再减去一个下标数
    //
    //    while(left<=right)
    //    {
    //        arr2[left] = arr1[left];
    //        arr2[right] = arr1[right];
    //        printf("%s\n", arr2);//
    //        Sleep(1000);// 1000单位是毫秒,需要引用头文件,#include
    //        //清空屏幕
    //        system("cls");// system是一个库函数,可以执行系统命令, 需要引用头文件,#include
    //        left++;
    //        right--;
    //    }
    //    printf("%s\n", arr2);
    //
    //    return 0;
    //}


    //-----------------------------------------------------------------------------------------------5.模拟用户登录密码
    // 编写代码实现,模拟用户登录情景,并且只能登陆三次
    //只允许输入三次密码,如果密码正确则提示登陆成功,如果三次均输入错误,则退出程序

    //比较两个字符串是否相等,不能使用等号,应该使用库函数: strcmp\
    //需要引用头文件
    #include
    //如果返回值是 0,表示两个字符串相等


    int main()
    {
        int i = 0;
        int password[6] = { 0 };

        //假设密码是字符 abcdef
        for (i = 0; i < 3; i++)
        {
            printf("请输入密码:>");
            scanf("%s", password); //数组不需要取地址
            //    if (password == "abcdef") 
            if (strcmp(password, "abcdef") == 0)  //比较两个字符串是否相等,使用库函数 strcmp
            {
                printf("登录成功\n");
                break;
            }
            else
            {
                printf("密码错误\n");
            }
        }
        if (i == 3)
        {
            printf("三次密码均输入错误,退出程序");
        }
        return 0;
    }

    //今天共接触了三个新的头文件
    /*
    #include
        Sleep(1000);// 1000单位是毫秒,需要引用头文件,#include

    #include
        system("cls");// system是一个库函数,可以执行系统命令, 需要引用头文件,#include
        cls 清屏

    #include
         if (strcmp(password ,"abcdef")==0)  //比较两个字符串是否相等,使用库函数 strcmp
    */


     

  • 相关阅读:
    【CASS精品教程】cass3d基于osgb根据点、线、面提取高程,生成等高线
    微服务架构设计:构建高可用性和弹性的应用
    ffmpeg之avformat_alloc_output_context2
    服务端程序员学css记录
    zookeeper源码(10)node增删改查及监听
    Java Class isAnonymousClass()实例讲解
    WWDC22 前瞻:iOS 16、iPadOS 16等五大操作系统亮相,AR/VR头显将缺席?
    详解 gRPC 客户端长连接机制实现
    XSSFWorkbook Excel导出导入
    机器人的组成
  • 原文地址:https://blog.csdn.net/most_wanted_/article/details/142279857