二分查找以及循环练习

简介: 二分查找以及循环练习

1 在一个有序数组中查找每个具体的某个数字n(二分查找)

常规方法:(缺点:如果要找的数字在最后一位,则需要遍历整个数组,浪费时间)

1. #include <stdio.h>
2. int main()
3. {
4.  int i = 0;
5.  int k = 7;
6.  int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
7.  for (i = 0; i < 10; i++)
8.  {
9.    if (arr[i] == k)
10.     {
11.       printf("找到了,下表为%d", i);
12.       break;
13.     }
14.   }
15.   if (i == 10)
16.   {
17.     printf("没有");
18.   }
19.   return 0;
20. }

二分查找法(折半查找法):(比较,缩小范围)

arr[]={1,2,3,4,5,6,7,8,9,10},在这里还是找数字k=7,

首先用1的下标0(left1),和10的下标9(right1),相加除于2等于4(mid1)余1,用下标为4(mid1)的数字5和7比较,7显然在5的右边;

然后用下标5(mid1+1)(left2)和10的下标9(right2)相加除于2等于7(mid2),用下标为7的数字8和7比较,7在8的右边;

然后用下标6(mid2-1)(right3)和left2(left3)相加除于2等于5(mid3),用下标为5的数字6和7比较,7在6的右边

最后用下标6(mid3+1)和结尾3相加除于2等于6,刚好等于7。

代码展示:

1. #include <stdio.h>
2. int main()
3. {
4.  int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
5.  int k = 7;
6.  int a = sizeof(arr) / sizeof(arr[0]);
7.  int left = 0;
8.  int right = a - 1;
9.  while (left <= right)
10.   {
11.     int mid = (right + left) / 2;
12.     if (arr[mid] < k)
13.     {
14.       left = mid + 1;
15.     }
16.     else if (arr[mid] > k)
17.     {
18.       right = mid - 1;
19.     }
20.     else
21.     {
22.       printf("找到了,下标是%d", mid);
23.       break;
24.     }
25.   }
26.   if (left > right)
27.   {
28.     printf("找不到");
29.   }
30.   return 0;
31. }

2  编写代码,演示多个代码从两端移动,向中间汇聚

举例说明: “#######” “a#####g” “ab###fg” “abc#efg” “abcdefg” ,就这样一步一步展示出来的就是多个代码从两端移动,向中间汇聚。

代码展示:

1. #include <stdio.h>
2. #include <windows.h>
3. int main()
4. {
5.  char arr1[] = "abcdefg";
6.  char arr2[] = "#######";
7.  int left = 0;
8.  int right = strlen(arr1) - 1;
9.  while (left <= right)
10.   {
11.     arr2[left] = arr1[left];
12.     arr2[right] = arr1[right];
13.     printf("%s\n", arr2);
14.     Sleep(1000);
15.     system("cls");
16.     left++;
17.     right--;
18.   }
19.   printf("%s", arr2);
20.   return 0;
21. }

代码理解

代码1展示:

1. #include <stdio.h>
2. #include <windows.h>
3. int main()
4. {
5.  char arr1[] = "abcdefg";
6.  char arr2[] = "#######";
7.  int left = 0;
8.  int right = strlen(arr1) - 1;
9.  while (left <= right)
10.   {
11.     arr2[left] = arr1[left];
12.     arr2[right] = arr1[right];
13.     printf("%s\n", arr2);
14.     left++;
15.     right--;
16.   }
17.   return 0;
18. }

新知识:Sleep()函数,括号内放置数字,单位为毫秒(一秒=1000毫秒=1000 000微秒=1000 000 000纳秒),需要时调用的头文件是#include <windows.h> 。

例如:

Sleep(1000),若是上面的代码块中printf()的后面一行插入(代码2展示),编码时,结果会每隔一秒出现一行。就是第一次出现a#####g,一秒后出现a#####g,又一秒后出现a#####g,一秒后出现a#####g

                                                         ab###fg                          ab###fg                      ab###fg

                                                                                                 abc#efg                      abc#efg

                                                                                                                                    abcdefg

代码2展示:

1. #include <stdio.h>
2. #include <windows.h>
3. int main()
4. {
5.  char arr1[] = "abcdefg";
6.  char arr2[] = "#######";
7.  int left = 0;
8.  int right = strlen(arr1) - 1;
9.  while (left <= right)
10.   {
11.     arr2[left] = arr1[left];
12.     arr2[right] = arr1[right];
13.     printf("%s\n", arr2);
14.     Sleep(1000);
15.     left++;
16.     right--;
17.   }
18.   return 0;
19. }

system("cls")清除调试台的内容。

代码3展示:

1. #include <stdio.h>
2. #include <windows.h>
3. int main()
4. {
5.  char arr1[] = "abcdefg";
6.  char arr2[] = "#######";
7.  int left = 0;
8.  int right = strlen(arr1) - 1;
9.  while (left <= right)
10.   {
11.     arr2[left] = arr1[left];
12.     arr2[right] = arr1[right];
13.     printf("%s\n", arr2);
14.     Sleep(1000);
15.     system("cls");
16.     left++;
17.     right--;
18.   }
19.   printf("%s", arr2);
20.   return 0;
21. }

复习知识点:打印字符串用%s,打印字符用%c.

知识点总结:(1)整数类型数组,求最大下标是多少:a=sizeof(arr[])/sizeof(arrr[0])-1

                       (2)字符类型:strlen(arr)-1  sizeof(arr[])-2(因为/0也算一个字节)

3 编写代码实现,模拟用户登录情景,并且只能登陆三次(只允许输入三次密码,如果密码正确则提示登陆成功,如果三次均输入错误,则退出程序)

代码展示:

1. #include <stdio.h>
2. #include <string.h>
3. int main()
4. {
5.  int i = 0;
6.  char password[20] = "";
7.  for (i = 0; i < 3; i++)
8.  {
9.    printf("请输入密码");
10.     scanf("%s", password);
11.     if ((strcmp(password, "123456")) == 0)
12.     {
13.       printf("登陆成功\n");
14.       break;
15.     }
16.     else
17.     {
18.       printf("密码错误\n");
19.     }
20.   }
21.   if (i == 3)
22.   {
23.     printf("密码三次均输入错误,退出程序");
24.   }
25.   return 0;
26. }

知识点:

(1)scanf("%d",password)  为什么不是 scanf("%d",&password)   因为password是数组名,数组名本来就是地址,所以不需要取地址符号。

(2)strcmp()函数是string compare(字符串比较)的缩写,比较字符串返回整数。(头文件是string.h)

strcmp(str1,str2),str1=str2,返回0:;str1<str2,返回负数;str1>str2,返回正数。

4 猜数字游戏

电脑随机产生一个数字,玩家猜。

代码展示:

1. #include <stdio.h>
2. #include <stdlib.h>
3. #include <time.h>
4. void menu()
5. {
6.  printf("**************************\n");
7.  printf("****    1.play   *********\n");
8.  printf("****    0.exit   *********\n");
9.  printf("**************************\n");
10. }
11. void game()
12. {
13.   int guess = 0;
14.   int r = rand()%100 + 1;
15.   while (1)
16.   {
17.     printf("请输入猜测的数字:");
18.     scanf("%d", &guess);
19.     if (guess < r)
20.     {
21.       printf("猜小了\n");
22.     }
23.     else if (guess > r)
24.     {
25.       printf("猜大了\n");
26.     }
27.     else
28.     {
29.       printf("猜测正确");
30.       break;
31.     }
32.   }
33. }
34. 
35. int main()
36. {
37.   int input = 0;
38.   srand((unsigned int)time(NULL));
39.   do
40.   {
41.     menu();
42.     printf("请选择:");
43.     scanf("%d", &input);
44.     switch (input)
45.     {
46.     case 1:
47.       game();
48.       break;
49.     case 0:
50.       printf("退出游戏");
51.       break;
52.     default:
53.       printf("请重新输入");
54.       break;
55.     }
56.   } while(input);
57.   return 0;
58. }

代码新知识:

该代码中,#include <stdlib.h>  #include <time.h> 是产生随机数的头文件(记好)

%100 产生的是(0-99)

C语言中随机产生数字的是rand函数(产生的都是整数)(0-32767), 库文件是<stdlib.h>。

相关文章
|
存储 关系型数据库 MySQL
MySQL 处理大数据表的 3 种方案,写的太好了,建议收藏!!
MySQL 处理大数据表的 3 种方案,写的太好了,建议收藏!!
960 0
|
9月前
|
Java 数据库连接 数据库
springboot java.lang.ClassNotFoundException: dm.jdbc.driver.DmDriver应该如何解决
通过上述步骤,可以有效解决Spring Boot项目中遇到的 `java.lang.ClassNotFoundException: dm.jdbc.driver.DmDriver`问题。确保在项目中正确添加达梦数据库的JDBC驱动依赖,并在配置文件中正确配置数据源信息,是解决此问题的关键。通过这些方法,可以确保Spring Boot项目能够正确连接达梦数据库并正常运行。
1722 31
|
11月前
|
传感器 存储 物联网
物联网的定义和原理
物联网 (IoT) 是指由嵌入传感器、软件和网络连接的物理设备、车辆、电器和其他物理对象组成的网络,允许它们收集和共享数据。这些设备(也称为“智能对象”)的范围可以从简单的“智能家居”设备(如智能恒温器)到可穿戴设备(如智能手表和支持RFID的服装),再到复杂的工业机械和运输系统。技术人员甚至设想了基于物联网技术的整个“智慧城市”。
1671 1
|
存储 Linux
在Linux中,LVM是什么?
在Linux中,LVM是什么?
|
移动开发 小程序 前端开发
uniapp中uview组件库CircleProgress 圆形进度条丰富的使用方法
uniapp中uview组件库CircleProgress 圆形进度条丰富的使用方法
2068 1
|
数据库
港澳台人员社会保障号校验
港澳台人员社会保障号校验
1270 0
|
缓存 关系型数据库 MySQL
MySQL登录时出现Access denied for user ‘root‘@‘localhost‘ (using password: YES)无法打开的解决方法
MySQL登录时出现Access denied for user ‘root‘@‘localhost‘ (using password: YES)无法打开的解决方法
22147 0
|
Java
AVL树(Java)
AVL树(Java)
355 0
|
敏捷开发 数据可视化 Java