首先我们来解释一下折半查找:
1.对一组具有升序(降序)的序列取其中间值,啪一刀斩断,
2.然后就进行比较啦,如果比较等于中间值,返回不解释。
3.如果小于中间值,就将查找范围变成右(左)边。
4.如果大于中间值,就将查找范围变成左(右)边。
5.一直到左边参数大于右边为止咯;查找数值
#include
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]
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
{
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]
{
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
#include
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 strlen(src))
{
*dst = '\0';
printf("开始点或长度不符合规则");
return 0;
}
for( i = start-1;i
{
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
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
int main()
{
double height = 100;
int count;
double sum = 0;
for(count = 0;count
{
sum += height;
height /= 2;
if(count
sum += height;
}
printf("%f %f",sum,height);
return 0;
}
猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,好不过瘾,又多吃了一个。第二天早上又吃了剩下的桃子的一半,又多吃了一个。以后每天都吃了前一天剩下的一半零一个,到第 10 天早上想再吃的时候,就剩下一个桃子。求第一天共摘多少个桃子。//猴子吃桃
#include
int main()
{
int sum = 1;
int day = 0;
for( day=1; day
{
sum = (sum+1)*2;
}
printf("%d",sum);
return 0;
}