猜数字小游戏 (C语言)

什么是二分法

二分法所属现代词,指的是数学领域的概念,经常用于计算机中的查找过程中。

把函数f(x)的零点所在的区间[a,b](满足f(a)●f(b)<0)“一分为二”,得到[a,m]和[m,b]。根据“f(a)●f(m)<0”是否成立,取出零点所在的区间[a,m]或[m,b],仍记为[a,b]。所对得的区间[a,b]重复上述步骤,直到包含零点的区间[a,b]“足够小”,则[a,b]内的数可以作为方程的近似解。


二分法的使用条件

待查找的序列区间单调有序(单调递增或单调递减都可以)
待查找序列和题目的要求建立的函数关系单调有序


二分法使用方法

假设待查找序列和题目的要求之间的关系是单调递增的,先取区间的中心,判断该处函数值和题目标准值的大小关系,如果函数值偏小,那么应该在中心右侧的区间继续查找;如果函数值偏大 ,那么应该在中心左侧区间继续查找,直到找到对应的值或者区间缩小到左右端点之间不再包含其他数据结束。


二分法的简单举例

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main() {
	int num;
	int arr[10] = {0,1,2,3,4,5,6,7,8,9};
	int left = 0;
	int right = sizeof(arr)/sizeof(arr[0])-1;
	printf("请输入一个10以内的整数:");
	scanf("%d", &num);
	while (left <= right) {
		int mid = (left + right) / 2;
		if (num > arr[mid]) {
			left = mid + 1;
		}
		else if (num < arr[mid]) {
			right = mid - 1;
		}
		else {
			printf("找到了!\n");
			break;
		}
		if (num > arr[9]) {
			printf("输入错误!\n");
			break;
		}
	}
	
	system("pause");
	return 0;
}

运用二分法思想完成一个猜数字的小游戏

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int Menu() {
	printf("*************************************\n");
	printf("            1.开始游戏\n");
	printf("            0.退出游戏\n");
	printf("*************************************\n");
	int choice = 0;
	printf("请输入你的选择:");
	scanf("%d", &choice);
	return choice;
}
void game() {
	int num = 0;
	int to_guess = rand() % 100 + 1;
	while (1) {
	printf("请输入一个1-100内的数:");
	scanf("%d", &num);
		if (num > to_guess) {
			printf("大了!\n");
		}
		else if (num < to_guess) {
			printf("小了!\n");
		}
		else {
			printf("猜对了!\n");
			break;
		}
	}
}
int main() {
	srand(time(0));
	while (1) {
		int choice = Menu();
		if (choice == 1) {
			game();
		}
		else if (choice == 0) {
			printf("下次再见!\n");
			break;
		}
		else {
			printf("您的输入有误!\n");
		}
	}
	system("pause");
	return 0;
}

写在文后的一段代码解释(大部分参考xiaoxiongli)

rand()%100表示0-99之间的整数 rand()%100+1即为1-100间的整数

rand用来产生随机数 srand用来初始化随机种子

srand这个函数要放在循环外面或者是循环调用外面否则得到的数字相同

rand()  srand()均包含在<stdlib.h>头文件中

因为rand的内部实现是用线性同余法做的,他不是真的随机数,只不过是因为其周期特别长,所以有一定的范围里可看成是随机的,rand()会返回一随机数值,范围在0至RAND_MAX 间。在调用此函数产生随机数前,必须先利用srand()设好随机数种子,如果未设随机数种子,rand()在调用时会自动设随机数种子为1。rand()产生的是假随机数字,每次执行时是相同的。若要不同,以不同的值来初始化它.初始化的函数就是srand()。

srand()用来设置rand()产生随机数时的随机数种子。参数seed必须是个整数,通常可以利用time(0)的返回值来当做seed。如果每次seed都设相同值,rand()所产生的随机数值每次就会一样。

猜你喜欢

转载自blog.csdn.net/qq_41359293/article/details/88835652