首先我们来解释一下折半查找:
1.对一组具有升序(降序)的序列取其中间值,啪一刀斩断,
2.然后就进行比较啦,如果比较等于中间值,返回不解释。
3.如果小于中间值,就将查找范围变成右(左)边。
4.如果大于中间值,就将查找范围变成左(右)边。
5.一直到左边参数大于右边为止咯;
////查找数值 #include <stdio.h> void swap(int v[],int a, int b) { int temp; temp = v[a]; v[a] = v[b]; v[b] = temp; } void qsort(int v[],int left, int right) //写了一个快速查找的方法,进行排序 { int i,last; //博客前面有一篇有解释 if(left >= right) return; swap(v,left,(left+right)/2); last = left; for(i = left +1;i <= right;i++) { if(v[i] < v[left]) swap(v,++last,i); } swap(v,left,last); qsort(v,left,last-1); qsort(v,last+1,right); } void BSearch(int v[],int f,int l,int r); int main() { int arry[10] = {0}; int find = 0; int i = 0; int left = 0,right = sizeof(arry)/sizeof(arry[0]); printf("请输入一组数字(10个):"); for(i=0 ;i < 10; i++) { scanf("%d",&arry[i]); } printf("请输入想查找的数值"); scanf("%d",&find); qsort(arry,left,right-1); BSearch(arry,find,left,right); return 0; } void BSearch(int v[],int find,int left,int right) { int mid = 0; if(left >= right) { return ; } while(left <= right) { mid =(left + right)/2; if(v[mid] == find) { printf("存在%d",find); return ; } else if(v[mid] < find) { left = mid +1; } else if(v[mid] > find) { right = mid -1; } } printf("不存在"); }
一个substr的实现,题目是这样的奥:
编写一个函数,它从一个字符串中提取一个子字符串。函数原型如下:
int substr(char dst[], char src[],int start, int len)
{}
目标是:从 src 数组起始位置向后偏移 start个字符的位置开始,最多复制 len 个非NUL 字符到 dst数组。在复制完毕之后, dst 数组必须以 NUL字节结尾。函数的返回值是存储于 dst 数组中的字符串的长度。
PS:其实题目还有一些要求,只是没有加入进去罢了:
//substr #include <stdio.h> #include <string.h> int substr(char dst[],char src[],int start,int len); int main() { char src[50]; char dst[20]; int count; int start = 0,len = 0; printf("请输入一串字符"); scanf("%s",&src); printf("请输入开始的起始值"); scanf("%d",&start); printf("请输入长度截取的"); scanf("%d",&len); count = substr(dst,src,start,len); printf("%d",count); return 0; } int substr(char dst[],char src[],int start,int len) { int i,j,count; j = 0; count = 0; if(start < 0 || (start+len) > strlen(src)) { *dst = ‘\0‘; printf("开始点或长度不符合规则"); return 0; } for( i = start-1;i < start + len-1;i++,j++) { if(src[i] == ‘\0‘) return 0; dst[j] = src[i]; count++; } dst[j] = ‘\0‘; return count; }
有一个分数序列
2/1+3/2+5/3+8/5+13/8+…
求出这个数列前 20 项的和。
//分母计算 #include <stdio.h> int main() { double molecular,denominator,sum; int i; i = 0; sum =0; molecular = 2; denominator = 1; for( i = 0; i<20; i++) { int temp = molecular; sum += (molecular / denominator); molecular += denominator; denominator = temp; } printf("%f",sum); return 0; }
一个球从 100 米高的自由落下,每次落地后反跳回原高度的一半,再落下,再反弹。求第
10次落地时,共经过多少米,第 10 次反弹多高。
//高度计算 #include <stdio.h> int main() { double height = 100; int count; double sum = 0; for(count = 0;count < 10;count++) { sum += height; height /= 2; if(count < 9) sum += height; } printf("%f %f",sum,height); return 0; }
猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,好不过瘾,又多吃了一个。第二天早上又吃了剩下的桃子的一半,又多吃了一个。以后每天都吃了前一天剩下的一半零一个,到第 10 天早上想再吃的时候,就剩下一个桃子。求第一天共摘多少个桃子。
//猴子吃桃 #include <stdio.h> int main() { int sum = 1; int day = 0; for( day=1; day < 10; day++) { sum = (sum+1)*2; } printf("%d",sum); return 0; }
本文出自 “剩蛋君” 博客,请务必保留此出处http://memory73.blog.51cto.com/10530560/1676801
原文地址:http://memory73.blog.51cto.com/10530560/1676801