目录
1.关于while(条件表达式) 循环体,以下叙述正确的是( )? (假设循环体里面没有break,continue,return,goto等等语句)
2.下面这段程序的输出结果是什么?
3.......做一个简单的猜数字游戏
4.写一个二分查找,并分析其时间复杂度
今天是恢复更新的第一天,话不多说,接下来直接上题目:
1.关于while(条件表达式) 循环体,以下叙述正确的是( )? (假设循环体里面没有break,continue,return,goto等等语句)
A.循环体的执行次数总是比条件表达式的执行次数多一次
B.条件表达式的执行次数总是比循环体的执行次数多一次
C.条件表达式的执行次数与循环体的执行次数一样
D.条件表达式的执行次数与循环体的执行次数无关
这道题是非常经典的一道题目, 主要考察的是对while循环的理解。
举个栗子:
int main()
{
int num = 1;
while (num <= 100)
{
printf("%d ", num);
num++;
}
return 0;
}
在这个while循环中先进行判断条件num <= 100之后,执行while循环的循环体,也就是说先执行条件表达式,再执行循环体;
执行条件表达式的次数比执行循环体的次数多一次,答案选择B项。
2.下面这段程序的输出结果是什么?
int main() { int a = 0, b = 0; for (a = 1, b = 1; a <= 100; a++) { if (b >= 20) break; if (b % 3 == 1) { b = b + 3; continue; } b = b-5; } printf("%dn", a); return 0; }
我对这道题的评价是:一道简单的程序分析题目,只要认真分析就能够得到正确答案。
看到这道题的猿友们可以试着自己分析一下,实在分析不出来也没有关系,我会放一张图解来帮助你们的(图解就在下面,你们收到了吗?哈哈)
最后结束时a的值为8,所以答案选择C项,实在不相信的话可以放在编译器上运行一下,编译器可是不会骗人的。
3.......做一个简单的猜数字游戏
首先我们先分析一下游戏的逻辑,这个游戏的逻辑简单的让人怀疑自己是不是想错了;
生成一个随机数,然后进行猜数字环节,如果猜对了——提示回答正确,如果猜的数字比生成的随机数大——提示猜大了,最后一种情况就是——猜小了(猜的数字比生成的数字小)。
怎么生成一个随机数?
提到随机数,就不得不说一个概念——时间戳(相比于现在的时间和电脑产生时间的差值,单位是妙),为什么提到时间戳的概念,因为时间戳无时无刻不在变化着,可以保证生成的数字就是随机的。
接下来怎么利用时间戳?
使用time函数,time函数的在这个程序里是不需要传参数的,直接传NULL(因为不需要保存,只是调用)。
所以可以这么使用srand函数和time函数;
srand((unsigned int)time(NULL));
time函数是有参数和返回值的,这里给大家推荐一个查阅文档的网站:C library - C++ Reference
time函数的返回值是如何描述的:
大概解释一下:如果传递的参数不为NULL,time函数的返回值就是对应的内存空间的值。
这里就有很多人会说了,为什么是英文网站啊,有没有中文的网站——英文网站的解释还是比较官方的,有很多中文文档都是在英文文档中翻译过来的,翻译的过程中多多少少会有一些错误,所以英文文档还是比较好一点的;还有就是看不懂英文文档没有关系,可以试着查翻译,借助工具来看文档。
完整源码:
#include#include #include int main() { srand((unsigned int)time(NULL)); int num = rand() % 100 + 1; while (1) { int guess = 0; printf("请输入数字:"); scanf("%d", &guess); if (guess == num) { printf("恭喜你,答对了n"); break; } else if (guess > num) printf("猜大了,请再试一次n"); else printf("猜小了,请再试一次n"); } return 0; }
4.写一个二分查找,并分析其时间复杂度
查找在我们日常生活中是非常常见的,像我们在图书馆的书架中查找一本书要查找层数、书架。二分查找则主要是查找数字的,而且有一个要求是非常苛刻的——这组数字必须是有序的 ,满足这个条件才能使用二分查找,否则都是不能使用的。
二分查找的思想(以升序为例):
找中间值,如果中间值大于要查找的数字,从中间值的左边去找;如果中间值小于要查找的数字,去中间值的右边去找;
重复上面的操作,结束的标志是找到要查找的数字或者是要查找的区间为1(最坏情况)。
int BinarySearch(int arr[], int size, int key)
{
int left = 0, right = size - 1;
while (left <= right)
{
int mid = left + (right - left) / 2;
if (arr[mid] == key)
return mid;
else if (arr[mid] > key)
right = mid - 1;
else
left = mid + 1;
}
return -1;//没找到
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int key = 5;//要查找的值
int size = sizeof(arr) / sizeof(arr[0]);
int ret = BinarySearch(arr, size, key);
if (ret != -1)
printf("找到了,下标是%dn", ret);
else
printf("没找到n");
return 0;
}
时间复杂度:O(log(N))
把我们查找的数组想象成一张纸,一次找中间值就是把纸对折一次,直到还有一个数字;
N个数,对折了x次(最坏情况)。



