【C语言】再次找的一些C语言题目,关于折半查找和某些种种

首先我们来解释一下折半查找:

    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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值