C语言笔记2 •二分法•

二分法的C实现

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int k = 0;
	scanf("%d", &k);
	int sz = sizeof(arr) / sizeof(arr[0]);
	int left = 0;
	int flag = 0;   //定义 flag = 0 假设是找不到
	int right = sz-1;
	int mid = 0;    //千万不要把这个 int mid = (left + right) / 2 写在外面,如果这样mid的值永远不会发生变化,必须写在循环里面

	while (left <= right)
	{    
		mid = (left + right) / 2;   
      //mid = left + (right-left) / 2;     //为了避免right和left值非常大引起的错误
		if (arr[mid] < k)
		{
			left = mid + 1;
		}
		else if (arr[mid] > k)
		{
			right = mid - 1;
		}
		else
		{
			printf("找到了,%d的下标是%d", k, mid);
			flag = 1;
			break;
		}
	}
	//if (left > right)
	//{
	//	printf("找不到");
	//}


	//此处判断 找不到 也可以这样写
	//if(flag == 0)
	if(!flag)
	{
		printf("找不到");
	}


	return 0;
}

设计函数实现

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

//int bin_search(int arr[], int left, int right, int key)
//arr 是查找的数组
//left 数组的左下标
//right 数组的右下标
//key   要查找的数字



int bin_search(int arr[], int left, int right, int key)
{
	int mid = 0;    
	while (left <= right)
	{
		mid = left + (right-left) / 2;     //为了避免right和left值非常大引起的错误
		if (arr[mid] < key)
		{
			left = mid + 1;
		}
		else if (arr[mid] > key)
		{
			right = mid - 1;
		}
		else
		{
			printf("找到了,%d的下标是%d", key, mid);
			return mid;
		}
	}
	if (left > right)
	{
		printf("找不到");
	}

	return -1;
}

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int k = 0;
	printf("请输入要查询的数字:");
	scanf("%d", &k);
	bin_search(arr, 0, 9, k);

	return 0;
}

在这两处代码里都有说到  平均值的求法,因为这里有个坑,看以下代码:

#include <stdio.h>
int main()
{
	//int a = INT_MAX; 2147483647 整型的最大值
	//int a = 2147483646;
	//int b = 2147483646;
	//printf("(a+b)/2=%d", (a + b) / 2); //Error

	int c = 2, d = 4;
	printf("(c+d)/2=%d\n", (c + d) / 2); // 正常求值



	int a = 2147483646;
	int b = 2147483646;
	int avg = a + (b - a) / 2;
	printf("%d", avg); 

	return 0;
}

    可以发现当a和b的值非常大的时候,其中一个值将接近最大值,两个数求和之和将大于最大值,超出了最大值的极限,则再求平均的话就会出错。
   

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值