C语言实现两个递减数列中寻找某一个数
本文实例讲述了C语言实现两个递减数列中寻找某一个数的方法,分享给大家供大家参考之用。具体方法如下:
通常来说这道题算二分查找法中非常有难度的一题了。
题目如下:
一个数组是由一个递减数列左移若干位形成,比如{4, 3, 2, 1, 6, 5}是由{6, 5, 4, 3, 2, 1}左移两位,在这种数组中查找某一个数。
实现代码如下:
int array[] = {4, 3, 2, 1, 6, 5}; const int size = sizeof array / sizeof *array; int findMinNumber(int (&array)[size], int start, int last, int dest) { int mid = (last - start) / 2 + start; int result; if(start > last) { return -1; } if(array[mid] == dest) { result = mid; return result; } if(array[mid] <= array[start]) { if(dest > array[mid] && dest <= array[start]) { last = mid - 1; result = findMinNumber(array, start, last, dest); } else { start = mid + 1; result = findMinNumber(array, start, last, dest); } } else if(array[mid] > array[start]) { if(dest < array[mid] && dest >= array[last]) { start = mid + 1; result = findMinNumber(array, start, last, dest); } else { last = mid - 1; result = findMinNumber(array, start, last, dest); } } return result; }
程序运行结果如下图所示:
希望本文所述对大家C程序算法设计的学习有所帮助。
相关推荐
-
C语言安全编码数组记法的一致性
对C语言程序来说,在同一文件中时,void func(char *a); 和 void func(char a[]); 完全等价 但在函数原型之外,如果一个数组在一个文件中声明为指针,在另一个不同的文件中声明为数组,那么它们是不等价的 示例代码如下: //main.c #include<stdlib.h> enum {ARRAYSIZE = 100}; char *a; void insert_a(void); int main(void) { a = (char*)malloc(ARRA
-
c语言动态数组示例
复制代码 代码如下: #include <stdio.h>#include <stdlib.h> int main(){ //从控制台获取初始数组大小 int N; printf("Input array length:"); scanf("%d",&N); printf("\n"); //分配空间 int *a; a=(int *)calloc(N,sizeof(int)
-
C语言安全之数组长度与指针实例解析
1.C语言编码需要保证变长数组的长度参数位于合法范围之内 例如以下代码: void func(size_t s) { int vla[s]; /*...*/ } /*...*/ func(size); /*...*/ 解决方案如下: enum {MAX_ARRAY = 1024}; void func(size_t s) { if(s < MAX_ARRAY && s != 0) { int vla[s]; /*...*/ } else { //错误处理 } } /*...*/ fu
-
C语言构建动态数组完整实例
本文以一个完整的实例代码简述了C语言构建动态数组的方法,供大家参考,完整实例如下: #include <stdio.h> #include <malloc.h> int main(void) { int len; int * arr; printf("请输入数组长度:"); scanf("%d", &len); arr = (int *)malloc(sizeof(int)*len); printf("请输入数组的值:&qu
-
c语言中用字符串数组显示菜单的解决方法
以前写菜单方面东西时往往重复, 发现这个方法还可以, 用一个指针的指针解决遍历问题.代码如下所示: 复制代码 代码如下: #include <stdio.h>static char *menu[] = { "1 --- push one item./n", "2 --- pop one item./n", "3 --- quit./n", NULL};void Show_menu();int main(){ Show_menu
-
C语言安全编码之数组索引位的合法范围
C语言中的数组索引必须保证位于合法的范围内! 示例代码如下: enum {TABLESIZE = 100}; int *table = NULL; int insert_in_table(int pos, int value) { if(!table) { table = (int *)malloc(sizeof(int) *TABLESIZE); } if(pos >= TABLESIZE) { return -1; } table[pos] = value; return 0; } 其中:p
-
深入理解c语言数组
一 数组名是什么 数组就是一段连续可用的内存.比如声明一个 int数组 int array[]={1,2,3}; array代表什么?有的资料说:数组名是指向数组首地址的常量指针. 下面我们可以验证一下.我都知道sizeof操作符可以返回一个对象或者类型所占的内存字节数.如:int i=1:那么sizeof(i) 的结果就是4(64位机器下的部分编译器是8) 那我们打印sizeof(array) printf("%d\n",sizeof(array)); 结果是:12. 但是我们都知道
-
c语言的cps实现求fibonacci数列示例
CPS:http://en.wikipedia.org/wiki/Continuation-passing_style示例代码使用迭代 + 尾递归. 复制代码 代码如下: #include <stdio.h> typedef void (*END_OF_END)(unsigned long);void fibonacci(int, unsigned long, unsigned long, void(*)(unsigned long)); voidnotify(unsigned long re
-
C语言中全局数组和局部数组的问题
今天同学遇到一个在C语言中全局数组和局部数组的问题,卡了许久,我也没有第一时间看出问题,现在把问题梳理一下,并给出解决方案. 问题描述: 在全局声明的数组与在局部声明的数组有着不同的效果. 首先来看一个程序: 复制代码 代码如下: #include <stdio.h> #include <stdlib.h> #define MAX 10 char a[MAX]; int main() { int i; char b[MAX]; char *c=(char *)malloc(MAX
-
C语言数组指针的小例子
1.功能:输入6个学生的5门课程成绩,计算出每个学生的平均分和每门课程的平均分.2.C语言实现代码:(其实就是用二维数组来实现的,二维数组的引用传递使用数组指针来完成) 复制代码 代码如下: #include <stdio.h>#define STUDENT 5#define SCORE 6void input_array(float (*score)[STUDENT]);void avg_score(float (*score)[STUDENT]);void avg_course(float
-
C语言二维数组的处理实例
复制代码 代码如下: char finalPathSet[256][256]; char middlePathSet[256][256]; int finalSetSize=0; int middleSetSize=0; int addToPathSet(char path[]){ strcpy(middlePathSet[middleSetSize],path); middleSetSize++;}int meetPathSet(){ char tempPathSet[256
-
C语言柔性数组实例详解
本文实例分析了C语言柔性数组的概念及用法,对于进一步学习C程序设计有一定的借鉴价值.分享给大家供大家参考.具体如下: 一般来说,结构中最后一个元素允许是未知大小的数组,这个数组就是柔性数组.但结构中的柔性数组前面必须至少一个其他成员,柔性数组成员允许结构中包含一个大小可变的数组,sizeof返回的这种结构大小不包括柔性数组的内存.包含柔数组成员的结构用malloc函数进行内存的动态分配,且分配的内存应该大于结构的大小以适应柔性数组的预期大小.柔性数组到底如何使用? 不完整类型 C和C++对于不完
-
约瑟夫环问题(数组法)c语言实现
问题说明这个问题是以弗拉维奥·约瑟夫斯命名的,它是1世纪的一名犹太历史学家.他在自己的日记中写道,他和他的40个战友被罗马军队包围在洞中.他们讨论是自杀还是被俘,最终决定自杀,并以抽签的方式决定谁杀掉谁.约瑟夫斯和另外一个人是最后两个留下的人.约瑟夫斯说服了那个人,他们将向罗马军队投降,不再自杀.约瑟夫斯把他的存活归因于运气或天意,他不知道是哪一个机智的约瑟夫! 有N个编号为1~N的人围成一圈,现在每隔两个人(比如:1.4 之间隔了2.3)就将一个人淘汰出去,问最后剩下的是编号为几的人? 算法代
随机推荐
- Groovy编程入门攻略
- Mac中Python 3环境下安装scrapy的方法教程
- JS/jquery实现一个网页内同时调用多个倒计时的方法
- 原生JS获取元素的位置与尺寸实现方法
- asp.net listbox实现单选全选取消
- linux shell命令执行顺序的控制方法
- Python3.2中的字符串函数学习总结
- 将数组中指定数量的元素移动数组后面的实现代码
- EditText监听方法,实时的判断输入多少字符
- javascript打开word文档的方法
- ThinkPHP使用心得分享-上传类UploadFile的使用
- VBS教程:函数-ScriptEngineMajorVersion 函数
- iPhone手机上搭建nodejs服务器步骤方法
- linux压缩常用命令小结
- 从汇编看c++中多态的应用
- Android开发之高德地图实现定位
- 在Android上实现HttpServer的示例代码
- [基础知识]Linux新手系列之四
- Pclxav木马猎手第一代特征码引擎源代码
- 运行java的class文件方法详解