首页
学习
活动
专区
圈层
工具
发布

C语言练习之二分法

前言 二分法查一个数 编写代码在一个整形有序数组中查找具体的某个数 要求:找到了就打印数字所在的下标,找不到则输出:找不到。...,但是由于数组下标由0开始,所以-1得到数组最后一位元素的下标 //要注意的是,如果这个部分int right = sizeof(arr)/sizeof(arr[0]),也就是没有减一的情况, //相应的下面循环部分的条件就要改为...{ left = mid; } } return 0; } 运行截图: ---- 总结   以上就是今天要讲的内容,本文简单的介绍了用C语言在一个有序整数数组中用二分查找法查找一个数返回它的下标的思路...,还进一步展示了代码的运行结果验证了作者的思路。...本文的作者也只是一个正在学习C语言等编程知识的萌新,若这篇文章中有哪些不正确的内容,请在评论区向作者指出(也可以私信作者),欢迎大佬们指点,也欢迎其他正在学习C语言的萌新和作者进行交流。

47610

C语言实现二分法

现在有一个任务:从一堆有序数字中找出其中一个数字 有两种方法 1)从头到尾依次寻找 2)从该些数字中中间部位比较若小于要找数字则在后半部分否则在前半部分 再进行这样的方式进行循环,直至找到或找不到此数字...现介绍这样的方法——二分法 在计算机科学中,二分搜索(英语:binary search),也称折半搜索(英语:half-interval search)、对数搜索(英语:logarithmic search...),是一种在有序数组中查找某一特定元素的搜索算法。...搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。...现在剖析算法 首先定义一个包含n个数字的数组A中有A0<=A1<=A2.......

33010
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【C语言刷怪篇】二分法

    因此在日常生活中,不管我们遇到的是什么样的问题,我们都应该先去直面它,尽自己最大的力想出该问题的解决方法,这样我们才能触类旁通,事半功倍 以下是近期学习C语言时遇到一些有意思的题目,想与大家分享一下...不会的也可以私信我哈 编写程序数一下 1到 100 的所有整数中出现多少个数字9 三、二分法 3.1 编写代码在一个整形有序数组中查找具体的某个数 注意这里是有序的数组...而二分法也是同样的方法,只不过每次我们都取中间的那个数字作为参考,再来和我们要找的数字进行对比,缩小空间,如果数字在这个有序数组里面,则找到数字就停止运行,并打印数字,如果数字没有在有序性数组里面,则程序会一直持续运行直到左边的数字和右边的数字都一样或者已经相交才停止运行...先将最左边的数字下标确定为0,在依次排序到最右边的下标9 2.将两个下标相加后除2得到中间的下标,再用中间这个数与我们的目标进行对比,如果中间这个数比目标大,则最右边的下标变为刚才取的中间的下标...EOF),以便多输入几次数据方便查找,所以我们要把left、right、mid、a这几个变量定义在循环里面,使得每次输入都重新给这些变量赋值 运行结果: 以上就是我近期C语言学习中遇到的一些有趣的问题

    35210

    【C语言】强制类型转换的原理

    : 这样的代码虽然能编译的过去,但其实是有不妥当的地方的,但平常我们在做题的时候难免遇到这样的代码风格,所以我们在这里解释一下这样的代码,但希望大家还是不要写出这样的代码来,这样的代码风格其实是不好的...5的二进制代码,然后进行结果的打印(如果这里不清楚浮点型的读取方法的话,可以去看我之前的博客,整形的存储) 1.2用指针操作符的转换形式 int a = 1234567890; float *f = (...,其实就是将a的二进制代码按照浮点型的形式拿出来,然后进行打印,如果你想要知道这个打印的结果的话,你必须写出来他的二进制代码,然后将其按照浮点型中表示方法的对应比特位的个数拿出来,最后进行结果读取 1.3...总结 这两种代码其实表达的内涵意思是相同的,他们是没有改变内存中变量的存储形式的,改变的是其读取方式,而且第二段的代码风格大家要学习,尽量写出这样的代码来。...,但因为精度的不同,所以我们两种浮点型能够表达的最大精度数字也是不同的,如果你这里编译一下第一段代码,就会发现它和第二段代码的结果不一样,这其实就是他的精度不够无法打印出你所期望的数字。

    1.7K10

    1.2 C语言运行原理

    为了让大家有个明确的学习方向,请大家分享给有需要的人,谢谢! 一、运行原理  作为一种编程语言,本身是谈不上工作原理的,实际上C语言所有的语法,正是C语言编译器的工作原理或者工作机制的具体实现。...要细致的讨论起来是不可能,但是作为C语言程序员,必须了解这个大致的流程。一个程序,从C语言源码,到系统可执行的文件,一般经历四个过程。 ?   ...1、预处理阶断,这个阶断是文本处理阶断,有预处理器来完成,会将源码中的带"#"开头的预处理命令进行相应的处理,在Linux上C语言的预处理器程序是cp命令。   ...2、编译阶断,这个阶断是有C语言编译阶断,在Linux上C语言的编译器是cc命令,它将C语言源码转换成汇编指令。   ...3、汇编阶断,这个阶断是汇编编译阶断,在Linux上C语言的汇编器是as命令,这个阶断会将汇编指令编译成二进制机器码。

    2.5K3129

    C语言可变参数的原理和应用

    概述 C语言中没有函数重载,解决不定数目函数参数问题变得比较麻烦; 即使采用C++,如果参数个数不能确定,也很难采用函数重载.对这种情况,有些人采用指针参数来解决问题 var_list可变参数介绍 VA_LIST...是在C语言中解决变参问题的一组宏,原型: typedef char* va_list; 其实就是个char*类型变量 除了var_list ,我们还需要几个宏来实现可变参数 「va_start、va_arg...可变参数原理 在进程中,堆栈地址是从高到低分配的.当执行一个函数的时候,将参数列表入栈,压入堆栈的高地址部分,然后入栈函数的返回地址,接着入栈函数的执行代码,这个入栈过程,堆栈地址不断递减, 「黑客就是在堆栈中修改函数返回地址...,执行自己的代码来达到执行自己插入的代码段的目的」....这么简单,指定第一个参数是后面参数的总数就可以了,这还不随随便玩 别着急,精彩的来了,「可变参数的应用」 可变参数应用:实现log打印 #include #include <stdio.h

    2.8K20

    C语言实现面向对象的原理

    不知道有多少人去了解过语言的发展史,早期C语言的语法功能其实比较简单。随着应用需求和场景的变化,C语言的语法功能在不断升级变化。...虽然我们的教材有这么一个结论:C语言是面向过程的语言,C++是面向对象的编程语言,但面向对象的概念是在C语言阶段就有了,而且应用到了很多地方,比如某些操作系统内核、通信协议等。...为什么要用C语言实现面向对象 阅读文本之前肯定有读者会问这样的问题:我们有C++面向对象的语言,为什么还要用C语言实现面向对象呢?...C语言这种非面向对象的语言,同样也可以使用面向对象的思路来编写程序的。只是用面向对象的C++语言来实现面向对象编程会更简单一些,但是C语言的高效性是其他面向对象编程语言无法比拟的。...所以这个问题其实很好理解,只要有一定C语言编程经验的读者都应该能明白:面向过程的C语言和面向对象的C++语言相比,代码运行效率、代码量都有很大差异。

    1.1K21

    C语言(支持插件的软件实现原理)

    平常使用的库文件分为静态库和动态库,而用的最多的动态库还分为静态联编和动态加载两种方式,所谓的动态加载就是插件式管理动态库,是非常实用的技术。...拓展: 假设有两个库,一个叫libxxx.so,一个叫libyyy.so,他们都实现了函数init(),但是功能不同,现在我们可以使用以下函数来动态加载指定的动态库: void *handle = dlopen...("libxxx.so", RTLD_NOW); // 获得libxxx.so的句柄handle void *p = dlsym(handle, "init"); // 获取对应的init函数指针 此后的代码...,就可以用指针p来调用libxxx.so中的init()了。...如果要调用另一个库的init(),只需要让dlopen()指定加载libyyy.so即可。这就是所谓的插件。

    2.1K20

    【C语言】剖析qsort函数的实现原理

    回调函数的实现 定义一个函数,然后将其作为参数传递给其他函数,在特定条件下执行 回调函数的示例 让我们以 C 语言为例,来看一个简单的回调函数示例: #include void performOperation...size: 参数size传入的参数是数组中单个元素的大小,该参数可以确保在函数内排序的时候每次跳跃的字节大小是一个元素的字节的大小。...qsort函数实现原理 详细定义 qsort 函数是一个用于快速排序(Quick Sort)的标准库函数。它接受一个数组和一个比较函数作为参数,并对数组进行排序。...实现原理 选择基准元素:qsort 函数首先选择数组中的一个元素作为基准元素。通常情况下,可以选择数组的第一个元素作为基准元素。...模拟实现sort 以下代码使用C语言模拟实现qsort函数的代码: #include void swap(int* a, int* b) { int temp = *a;

    61010

    【C语言】链表的使用及链表的实现原理

    1.逻辑结构上⼀个挨⼀个的数据,在实际存储时,并没有像顺序表那样也相互紧挨着。恰恰相 反,数据随机分布在内存中的各个位置,这种存储结构称为线性表的链式存储。...2.由于分散存储,为了能够体现出数据元素之间的逻辑关系,每个数据元素在存储的同时,要 配备⼀个指针,⽤于指向它的直接后继元素,即每⼀个数据元素都指向下⼀个数据元素 ** 本身的信息,称为“数据域”...** ** 指向直接后继的指针,称为“指针域”。...下面是一个单链表的实现过程 #include #include #include //结构体是⼀种⼯具,⽤这个⼯具可以定义⾃⼰的数据类型 typedef struct...=NULL) //,获取最后一个节点的位置,跳出循环的那时候是最后一个节点,判断后继节点是否为空 { p = p->pNext; } p->pNext=node; //下一个指针域指向新节点

    1.2K10

    【说站】c语言strcat_s函数的原理

    c语言strcat_s函数的原理 1、dst 内存空间大小=目标字符串长度+原始字符串场地+‘\0’。 2、使用sizeof函数获取内存空间大小,strlen函数获取字符串长度。...include "stdafx.h" #include #include #include #include "windows.h"   //error C4996...#pragma warning( disable : 4996)   void main() {     char src[1024] = { "C/C++教程-strcat_s函数" };     char... dst[1024] = { "www.codersrc.com" };     //注意:strcat_s第二个参数的计算,该参数是拼接后的字符串大小,并非原字符串大小或者目标字符串大小     int...以上就是c语言strcat_s函数的原理,希望对大家有所帮助。更多C语言学习指路:C语言教程 本教程操作环境:windows7系统、C11版,DELL G3电脑。

    82030

    聊聊C语言中的malloc申请内存的内部原理

    我们今天来深入地了解一下malloc函数的内部工作原理。 操作系统为应为应用层提供了 mmap、brk 等系统调用来申请内存。但是这些系统调用在很多的时候,我们并不会直接使用。...频繁的系统调用的开销比较大。和函数调用比起来,系统的调用的开销非常的大。如果每次申请内存都发起系统调用,那么我们的应用程序将慢如牛。 所以,现代编程语言的做法都是自己在应用层实现了一个内存分配器。...我们在学校里学习 C 语言时候使用的 malloc 函数的底层就是 glibc 的 ptmalloc 内存分配器实现的。...我们今天就以最经(古)典(老)的 ptmalloc 内存分配器讲起,带大家深入地了解 malloc 函数的内部工作原理。...以上就是 glibc 中的 ptmalloc 管理堆内存的基本原理。

    91610

    c++二分法查找_二分法查找python代码

    二分法应用条件:1)数组为有序数组。2)同时题目还强调数组中无重复元素,因为一旦有重复元素,使用二分查找法返回的元素下标可能不是唯一的。 区间的定义: 区间的定义不同代码就不同。...1)定义target在[left, right]区间 while (left 的,所以使用 <=。...,即:[left, right) while (left < right) { // 因为left == right的时候,在[left, right)是无效的空间,所以使用 < int middle...%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE.html#%E6%80%BB%E7%BB%93 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。...如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

    69320

    【C语言】初识C语言(常见的C语言概念)

    语言大致可以分为自然语言和计算机语言,自然语言就是人与人日常交流的语言,如汉语、英语、日语等等,计算机语言又可以分为机器语言、汇编语言、高级语言,C语言就是一个高级语言 机器语言:就是由二进制01组合起来的计算机可以直接识别的程序语言是一种面向机器的语言...,比起低级语言易懂易学,可移植性好,编程效率高,但是执行效率没有低级语言高,需要经过编译或解释,C语言就是采用编译的一种高级语言 二.为什么选择C语言 C语言常年霸榜各类高级语言前三,属于基础必学的语言...,其功能强大,而且许多语言都很相似,如果学好C语言,对学习其他语言也有很大帮助 三.编译器的选择 C语言是一门编译型的语言,需要依赖编译器将计算机语言转换成机器能够执行的机器指令 常见的编译器有:msvc...将后缀名.cpp改为.c就可以了,创建好后就可以开始写我们的第一个C语言程序了 注意:其中.c的文件叫源文件,.h的文件叫头文件(head),后面会慢慢讲到 五.第一个C语言程序 注:只需要跟着操作,后面会一一解释它们代表着什么...,按ctrl+k,ctrl+u可以取消注释 总结 以上就是今天所要讲的C语言常见的概念,下次讲C语言的数据类型和变量,如果今天的内容有不懂的还请在评论区留言,当然,还有许多不足的地方也请大家多多指正,谢谢

    6.8K11

    深入理解 C 语言中的二分法查找:从代码解析到实践优化

    在 C 语言的数据查找领域,二分法查找凭借其高效的性能,成为处理有序数组查找问题的 “利器”。...今天,我们就以一段具体的 C 语言代码为切入点,带大家全面认识二分法查找的实现逻辑、代码细节以及优化方向。 一、二分法查找的核心原理 在正式分析代码前,我们先明确二分法查找的适用条件和核心逻辑。...二、代码逐段解析:二分法的 C 语言实现 接下来,我们结合你提供的代码,逐部分拆解二分法查找的实现过程,同时梳理代码中的关键细节与潜在问题。 1....五、总结 本文以一段 C 语言代码为载体,从原理、解析、优化到实践,全面讲解了二分法查找的核心逻辑。...二分法作为一种高效的查找算法,是 C 语言学习中的重要知识点,也是面试中的高频考点。

    13410

    C语言递归详解:从原理到实战的深度剖析

    二、递归的执行流程:调用栈的“进”与“出” C语言递归通过调用栈(系统自动管理的栈结构)实现:每次递归调用时,当前函数的参数、局部变量和返回地址会被压入栈;当递归到基线条件并返回时,栈顶元素依次弹出,恢复到上一层函数的执行状态...递归思路: 基线条件:n=1时,直接将盘子从A移到C; 递归条件:n>1时,分三步: 将n-1个盘子从A经C移到B(借助C); 将第n个盘子从A移到C; 将n-1个盘子从B经A移到C(借助A)。...); // 从A经B移到C return 0; } 输出(3个盘子的移动步骤): Move disk 1 from A to C Move disk 2 from A to B...C Move disk 1 from A to C 案例3:二叉树的递归遍历(以先序遍历为例) 二叉树节点定义: typedef struct TreeNode { int val...”或迭代改写缓解,但C语言标准不保证尾递归优化)。

    6510

    C语言函数递归详解:理解递归的原理与应用

    摘要: 本文将详细介绍C语言中的函数递归,包括递归的原理、递归的基本结构、递归的应用场景以及递归的注意事项。通过代码示例,帮助读者深入理解和掌握C语言函数递归的概念与用法。...本文将详细介绍C语言中的函数递归,带你一步步了解它的原理、用法以及注意事项。 二、递归的原理 函数递归的原理基于两个关键思想:基本情况和递归调用。...三、递归的基本结构 函数递归的基本结构包括两个部分:递归函数的定义和递归函数的调用。 1. 递归函数的定义: 递归函数需要在函数体内部调用自身。函数的参数和返回值可以根据具体问题进行定义。...递归调用的条件: 确保递归函数在调用自身之前,问题能够被有效地分解为更小的子问题。 3. 递归的效率: 递归可能会导致函数的多次调用,因此在实际应用中需要注意递归的效率问题。...六、总结 本文详细介绍了C语言中的函数递归,包括递归的原理、基本结构、应用场景以及注意事项。通过代码示例,希望读者能够更加深入地理解和掌握函数递归的概念与用法。

    1.1K10
    领券