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

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

时间:2024-09-15 09:23:52浏览次数:14  
标签:折半 arr right int 鹏哥 37 ret printf left

#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
*/


 

标签:折半,arr,right,int,鹏哥,37,ret,printf,left
From: https://blog.csdn.net/most_wanted_/article/details/142279857

相关文章

  • 鹏哥C语言34---循环语句 do while
    //-------------------------------------------------------------------------------------------------3.3dowhile循环#include<stdio.h>//---------------------------------------------------------------------------------------------3.3.1do语句的语法/*do......
  • [ABC371D] 1D Country 题解
    这题,怎么说呢,\(STL\)大法好。前置芝士:lower_pound函数在结构体上的使用。那其实这题便是一个二分前缀和的水题了。结构体存储每个村庄的距离\(x\),人口\(d\)。对于每个输入的\([l,r]\)二分查找其对应的村庄,进行一次答案的统计,输出即可。代码:#include<bits/stdc++.......
  • ABC371
    呜呜呜,第一次打完完整的ABC。才打了2000多名,太菜了。(A-Jiro十分简单,分讨即可。点击查看代码#include<iostream>#include<cstdio>usingnamespacestd;chara,b,c;intmain(){ cin>>a>>b>>c; if(a=='>'){ if(b=='>'){ if(c==&#......
  • AtCoder Beginner Contest 371
    A-Jiro(abc371A)题目大意三个人,给定他们相互之间的大小关系。问谁在中间。解题思路排个序,大小结果就是题目给的,因为问的是中间是谁,所以写的时候并没在意是升序排还是降序排。神奇的代码#include<bits/stdc++.h>usingnamespacestd;usingLL=longlong;intmai......
  • AtCoder Beginner Contest 371
    ABC371总结AtCoderBeginnerContest371一些废话想着以后换一种方式写总结,不再以那种题解形式,写起来又累又难写,只对其中部分有意思的题目写出完整的题解。就是以随笔的形式,在打完比赛后写出自己的一些感悟,每道题做的过程中的一些思路、用时和需要改进的地方,就是类似随笔之类的......
  • AtCoder Beginner Contest 371
    https://atcoder.jp/contests/abc371C:暴力。思路是把1-8的点映射到全排列上面,然后把有的点去掉没的点加上取ans最小值。这题复杂度是\(8!\times7\times4\),暴力求全排列即可(第一次写暴力全排列思索了一会复杂度#include<bits/stdc++.h>usingnamespacestd;#definepiipai......
  • 题解 [ABC371G] Lexicographically Smallest Permutation(中文/English)
    本题解提供英文版,位于示例代码之后。Englishversionofthiseditorialisprovidedafterthesamplecode.官方题解竟然用Python来算高精度lcm,我来提供一个可以避免一切大整数运算的方法。考察\(u\getsP_u\)这张图的每个置换环。为了使答案字典序最小,显然需要从前往后......
  • Taro(ABC 371)
    #include<bits/stdc++.h>#defineendl'\n'#defineintllusingll=longlong;typedefunsignedlonglongull;usingnamespacestd;voidGordenGhost();signedmain(){#ifdefGordenfreopen("in.txt","rt",stdi......
  • FIT5137 M-Stay Residential service
    FIT5137Assignment2-S22024 (Weight=40%)Due-Friday,20September2024,4:30PMGeneralInformationandSubmissiono Thisisanindividualassignment.o Submissionmethod:SubmissionisonlinethroughMoodle.o Penaltyforlatesubmission:5%deduc......
  • Springboot二手物品交易系统03374--(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、研究背景随着互联网技术的飞速发展和人们消费观念的转变,二手物品交易逐渐成为一种流行的消费模式。传统的二手市场存在信息不对称、交易效率低......