当前位置: 首页 > news >正文

鹏哥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<windows.h>
#include<stdlib.h>
//
//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<windows.h>
//        //清空屏幕
//        system("cls");// system是一个库函数,可以执行系统命令, 需要引用头文件,#include<stdlib.h>
//        left++;
//        right--;
//    }
//    printf("%s\n", arr2);
//
//    return 0;
//}


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

//比较两个字符串是否相等,不能使用等号,应该使用库函数: strcmp\
//需要引用头文件
#include <string.h>
//如果返回值是 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<windows.h>
    Sleep(1000);// 1000单位是毫秒,需要引用头文件,#include<windows.h>

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

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


 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • CleanClip for Mac 剪切板 粘贴工具 历史记录 安装(保姆级教程,新手小白轻松上手)
  • (SERIES12)DM性能优化
  • Redis如何实现分布式锁
  • Kali Linux 2024.3 发布,包含新黑客工具
  • 挑战力扣高难度算法、数据库题
  • 基于Arduino Uno开发板实现PWM呼吸灯的设计方案
  • C语言-结构体-详解
  • 【数据结构与算法 | 灵神题单 | 自顶向下DFS篇】力扣1022,623
  • windows11+ubuntu20.04.6双系统安装
  • 数据结构-2.顺序表
  • Delta Function的简单介绍
  • 关于less的基本使用
  • Java设计模式—面向对象设计原则(一) ----->开闭原则OCP(完整详解,附有代码+案例)
  • re题(27)BUUFCTF-[MRCTF2020]Transform
  • C++速通LeetCode简单第18题-杨辉三角(全网唯一递归法)
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • angular2开源库收集
  • CSS 专业技巧
  • Java到底能干嘛?
  • js 实现textarea输入字数提示
  • leetcode386. Lexicographical Numbers
  • Linux后台研发超实用命令总结
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • PHP那些事儿
  • ReactNative开发常用的三方模块
  • webpack项目中使用grunt监听文件变动自动打包编译
  • 猴子数据域名防封接口降低小说被封的风险
  • 深入浅出Node.js
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 用jquery写贪吃蛇
  • C# - 为值类型重定义相等性
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • ​经​纬​恒​润​二​面​​三​七​互​娱​一​面​​元​象​二​面​
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • ​用户画像从0到100的构建思路
  • #DBA杂记1
  • $jQuery 重写Alert样式方法
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (2024最新)CentOS 7上在线安装MySQL 5.7|喂饭级教程
  • (70min)字节暑假实习二面(已挂)
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (function(){})()的分步解析
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (每日一问)基础知识:堆与栈的区别
  • (转)大型网站的系统架构
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • .bashrc在哪里,alias妙用
  • .bat文件调用java类的main方法
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .NET Core 2.1路线图
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .NET DevOps 接入指南 | 1. GitLab 安装