折半查找/二分查找-附加一个猜数字小游戏的代码

  • 再讲之前我先举一个列子,我们在和朋友玩的时候,看到他买了一双鞋,你问他多少钱呀? 他说1000以内,那么你会怎么猜呢?是从一到1000挨个猜呢?还是通过猜中间数字来尽快接近答案呢?*

  • 今天我们的折半查找就是来解决这样的查找问题的*

  • 折半查找就是在数据为有序的时候,我们将通过折半来直接否定错误答案,以最快的速度找到我们想要的数据。

    通过left 和right分别指向数据的最左边的地址和最右边的地址,在通过mid=(right+left)/2来确定是否地址为mid的数据为我们想要找到的数据。*

如果地址为mid大于我们要找的数据key,我们将left不变,right=mid-1;这样就可以将我们的查找范围直接缩小一半。

如果地址为mid小于我们要找的数据key,我们将right不变,left=mid+1。
如果地址为mid的数据为我们要找的key,则返回mid,结束查找。*

代码实现如下:

#define _CRT_SECURE_NO_WARINGS 

#include<stdio.h>

#include<string.h>

int main()

{

	int num[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };//有序数据

	int left = 0, right = 0, mid = 0;

	int key = 0;

	printf("输入你要查找的数\n");

	scanf_s("%d", &key);//要找的关键字

	right = sizeof(num) / sizeof(num[0]) - 1;//此处注意

	while (left <= right)//折半主要代码

	{

		mid = (left + right) / 2;

		if (num[mid] == key)

		{

			printf("找到了下标为:%d\n", mid); break;

		}

		else if (num[mid] < key)

			left = mid + 1;

		else if (num[mid]>key)

			right = mid - 1;

		else

			printf("查找失败");



	}//一定注意是num[mid]与key作比较



	return 0;

}

分享一下一个猜数字小游戏(内容仅为娱乐):

#define _CRT_SECURE_NO_WARINGS 

#include<stdio.h>

#include<string.h>

#include<stdlib.h>

#include<time.h>

int main()

{

int key = 0;

int i = 0;

int n = 0;

int a = 0;

flag1:

printf("*************************************************\n");

printf("*********选择1为开始游戏选择0为结束游戏**********\n");

printf("*************************************************\n");

printf("     快点输入:>");

scanf_s("%d", &i);

if (i == 1)

{

printf("游戏开始喽嘤嘤嘤<@.@>\n"); goto flag2;

}

else if (i == 0)

{

printf("不玩滚蛋<-.->\n"); goto flag3;

}

else

{

printf("看清楚标题好吗<?.?>\n"); goto flag1;

}

flag2:

  srand((unsigned)time(NULL));//加入时间戳,使随机数更加随机

n= rand() % 100 + 1;//将随机产生的数字控制在1~100之间

do

{

printf("请输入猜的数字嘻嘻嘻:>");

  scanf_s("%d", &key);

if (n < key)

printf("猜大了\n");

else if (n>key)

printf("猜小了\n");

else

{

printf("恭喜恭喜你太棒了,你简直是天才,放心你的前途是光明的,将来一定是你的,相信自己\n"); break;

}

} while (1);

printf("\n这么好玩,你还要玩吗?<@.@>要玩的话输入520\n       请输入:>");

scanf_s("%d", &a);

if (a == 520)

goto flag1;

else

printf("滚滚滚\n");

flag3:

return 0;

}
发布了9 篇原创文章 · 获赞 16 · 访问量 2385

猜你喜欢

转载自blog.csdn.net/Shangxingya/article/details/103507202