目录
前言
猜数字游戏
1.时间戳作随机值
2.主体
二分查找
1.连续数组
2.不连续的数组
在对分支与循环有初步了解之后,我们便可以做出一个简便的猜数字游戏。
想要独自进行数字的猜测,我们便需要一个随机值供我们进行猜测。
首先我们需要了解的是rand()函数,rand()返回值为一个随机数,但这个随机数的顺序是固定的,不具有随机性,并不适合直接作为该游戏的随机值来使用。
而与rand()函数搭配使用的是srand()函数,srand(unsigned int seed)所起的作用是设置rand()函数随机数的起点。
然而,要使随机数具有随机性,需要让rand()函数的起点具有随机性,即seed具有随机性,那么又返回到了类似的问题:该如何使seed具有随机性呢?
这时,便要利用到时间戳
时间戳 即当前计算机的时间-计算机的起始时间(秒)
而time()函数便是时间戳(long型)
我们让seed为time(NULL)或time(0),即可实现rand()具有的随机值具有随机性
注意:rand()、srand()函数的头文件为stdlib.h time()函数的头文件为time.h
在了解时间戳作随机值后,我们便可以进行游戏的编写。
为了使随机值具有一定的范围,我们可以利用求余对rand()函数进行处理,如
int a = rand() % 100+1;
表示a作为1~100之间的随机数。
在获取到随机数后便可进行猜测,由于猜测绝大概率不会一次完成,我们便要利用循环语句与分支语句嵌套使用。
#include
#include
int main()
{
srand((unsigned int)time(NULL));
int a = rand() % 100;
int num;
while (1)
{
scanf("%d", &num);
if (num > a)
printf("猜大了\n");
else if (num < a)
printf("猜小了\n");
else
{
printf("猜对了\n");
break;
}
}
return 0;
}
如此,便可以完成猜数字游戏;
类似于猜数字游戏,二分查找也是利用比较来接近想要查找(猜测)的数字
(1).在一个有序(从小到大)的数字数组中,我们可以通过比较该数组其中的一个数字与想要查找的数字的大小来判断想要查找的数字的相对位置
为了减少比较的次数,常常会选择该数组的中间的数字来做比较。
例如我们可以使用left表示数组最左侧元素的下标,right表示数组最右侧元素的下标,mid表示中间元素的下标
int num=7;
int arr[ ]={1,2,3,4,5,6,7,8,9};
int sz=sizeof(arr)/sizeof(arr[0]); //sz=9
int left=0;
int right=sz-1;
int mid=(left+right)/2; //mid=4
这样便可以进行所查找的值与中间元素arr[mid]的比较
(2).由于通常情况下,要进行多次判断,所以要使用到循环语句,并与if语句嵌套使用。而其中left、right、mid的值也要随之改变。
while(1)
{
if(arr[mid]==num)
{
printf("在数组中的下标为:%d\n",mid);
break;
}
else if(arr[mid]>num)
{
right=mid-1; //当中间元素大于查找元素,在中间元素左侧重新进行查找
mid=(left+right)/2;
}
else
{
left=mid+1; //当中间元素大于查找元素,在中间元素左侧重新进行查找
mid=(left+right)/2;
}
}
在经过多次循环后,便可以找出想要查找的数字。
#include
int main()
{
int num = 7;
int arr[] = { 1,2,3,4,5,6,7,8,9 };
int sz = sizeof(arr) / sizeof(arr[0]);
int left = 0;
int right = sz - 1;
int mid = (left + right) / 2;
while (1)
{
if (arr[mid] == num)
{
printf("%d\n", num);
break;
}
else if (arr[mid] > num)
{
right = mid - 1;
mid = (left + right) / 2;
}
else
{
left = mid + 1;
mid = (left + right) / 2;
}
}
return 0;
}
但是,有序数组并不一定连续。
例如以下数字及数组
int num=7;
int arr[ ]={1,2,3,4,5,6,8,9,10};
为避免因有序数组不连续造成结果的错误,我们可以对while循环语句做一下改进。
while(left<=right) //即数组查找范围内至少包含一个元素
{
if(arr[mid]==num)
{
printf("在数组中的下标为:%d\n",mid);
break;
}
else if(arr[mid]>num)
{
right=mid-1;
mid=(left+right)/2;
}
else
{
left=mid+1;
mid=(left+right)/2;
}
}if(left>right) //即当在while循环结束并且arr[mid]!=num
printf(“该数组中查找不到该数字”);
如此,便可完成不连续数组中的二分查找
#include
int main()
{
int num = 7;
int arr[] = { 1,2,3,4,5,6,8,9,10 };
int sz = sizeof(arr) / sizeof(arr[0]);
int left = 0;
int right = sz - 1;
int mid = (left + right) / 2;
while (left<=right)
{
if (arr[mid] == num)
{
printf("%d\n", num);
break;
}
else if (arr[mid] > num)
{
right = mid - 1;
mid = (left + right) / 2;
}
else
{
left = mid + 1;
mid = (left + right) / 2;
}
}
if (left > right)
printf("该数组中查找不到该数字");
return 0;
}