鹏哥C语言36-37---循环/分支语句练习(折半查找算法)

#define _CRT_SECURE_NO_WARNINGS

//----------------------------------------------------------------------------------------------------3.4 分支,循环练习

//用代码解决问题=先想办法(编程思维)+再写代码(按照语法形式)

//----------------------------------------------------------------------------------------------------3.4.1. 练习参考代码

#include <stdio.h>

//-----------------------------------------------------------------------------------------1.计算n的阶乘

//---------------------------------------------------while

//int main()

//{

// int n = 0;

// int i = 1;

// int ret = 1;

// scanf("%d", &n);

//

// while (i <= n)

// {

// ret = ret * i;

// i++;

// }

// printf("%d", ret);

//

// return 0;

//}

//---------------------------------------------------for

//int main()

//{

// int n = 0;

// int i = 1;

// int ret = 1;

// scanf("%d", &n);

//

// for (i = 1; i <= n; i++) 不考虑溢出问题

// {

// ret = ret * i;

// }

// printf("%d", ret);

//

// return 0;

//}

//-----------------------------------------------------------------------------------------2.计算1!+2!+3!+......+10!

// --------------------------------两个 for 循环嵌套效果较差,每次内部循环都重复

//int main()

//{

// int n = 0;

// int i = 1;

// int ret = 1;

// int ADD = 0;

//

// for(n=1;n<=3;n++)

// {

// ret = 1; // 每次内部循环的时候,必须给 ret 初始化

// for (i = 1; i <= n; i++)

// {

// ret = ret * i;

// }

// ADD = ADD + ret;// 自己老是忘记这个迭代的格式!!!!!!!

// }

// printf("%d", ADD);

//

// return 0;

//}

// ---------------------------------------------优化

//int main()

//{

// int n = 0;

// int ret = 1;

// int ADD = 0;

//

// for (n = 1; n <= 3; n++)

// {

// ret = ret * n;

// ADD = ADD + ret;

// }

// printf("%d", ADD);

//

// return 0;

//}

//--------------------------------------------------------------------------------3.从数组中查找数(折半查找算法)

//在一个有序的数组中查找具体的数字

//--------------------------------------------------一个一个找,效率慢

//int main()

//{

// int arr[] = { 1,2,3,4,5,6,7,8,9,10 };

// int k = 0;

// scanf("%d", &k);

// int i = 0;

// int size = sizeof(arr) / sizeof(arr[0]); // 求数组内元素个数,用了好几遍了

// for(i=0;i<=size;i++)

// {

// if (arr[i] == k)

// {

// printf("找到了,下标是:%d", i);

// break;

// }

// }

// if (i >= size)

// printf("找不到");

//

// return 0;

//}

//---------------------------------------------------折半查找算法(二分查找)

//代码麻烦,但是效率高,速度快,限制是只能应用于有序数组

/*

int main()

{

int arr[] = { 1,2,3,4,5,6,7,8,9,10 };

int k = 0;

scanf("%d", &k);

int i = 0;

int size = sizeof(arr) / sizeof(arr[0]);

int left = 0;

int right = size - 1;

while(left<=right)

{

int mid = (left + right) / 2;

if (arr[mid] < k)

{

left = mid + 1;

}

else if (arr[mid] > k)

{

right = mid - 1;

}

else

{

printf("找到了,下标是:%d", mid);

break;

}

}

if (left > right)

{

printf("找不到");

}

return 0;

}

*/

//---------------------------------------------------------------------------3.4.2 从数组中查找数(折半查找算法)

//在一个 有序 的数组中查找具体的数字

//-----------------------------------------------------------------------------折半查找算法(二分查找)

// 每次查找缩小一半范围

//代码麻烦,但是效率高,速度快,限制是只能应用于有序数组

//int main()

//{

// int arr[] = { 1,2,3,4,5,6,7,8,9,10 };

// int k = 0;

// scanf("%d", &k);

// int i = 0;

// int size = sizeof(arr) / sizeof(arr[0]);//求元素个数

// int left = 0;

// int right = size - 1;

//

// while (left <= right) // 关键二:一定是 <=

// {

// int mid = (left + right) / 2; // 关键一: 中间值mid 计算 一定要在循环里边

// //如果 left + right 的值超出了 int 整型所能表达的最大值,会产生位溢出,求得的平均值会不准确

// // int mid=left+(left+right)/2; //就避免溢出的问题

// if (arr[mid] < k)

// {

// left = mid + 1;

// }

// else if (arr[mid] > k)

// {

// right = mid - 1;

// }

// else

// {

// printf("找到了,下标是:%d", mid);

// break;

// }

// }

// if (left > right)

// {

// printf("找不到");

//

// }

// return 0;

//}

//-----------------------------------------------------------------------------------------4.从两端移动,向中间汇聚

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

//welcome to bit!!!

//###############

//w#############!

//we###########!!

//......

//welcome to bit!!!

#include<windows.h>

#include<stdlib.h>

//

//int main()

//{

// // int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; //整型数组

// char arr1[] = "welcome to bit!!!"; //字符数组

// char arr2[] = "#################";

//

// int left = 0;

// int right = strlen(arr1); //strlen 求字符串长度,求的是\0之前的元素个数,

// //int right = sizeof(arr1) / sizeof(arr1[0])-2; //先减去 \0, 再减去一个下标数

//

// while(left<=right)

// {

// arr2[left] = arr1[left];

// arr2[right] = arr1[right];

// printf("%s\n", arr2);//

// Sleep(1000);// 1000单位是毫秒,需要引用头文件,#include<windows.h>

// //清空屏幕

// system("cls");// system是一个库函数,可以执行系统命令, 需要引用头文件,#include<stdlib.h>

// left++;

// right--;

// }

// printf("%s\n", arr2);

//

// return 0;

//}

//-----------------------------------------------------------------------------------------------5.模拟用户登录密码

// 编写代码实现,模拟用户登录情景,并且只能登陆三次

//只允许输入三次密码,如果密码正确则提示登陆成功,如果三次均输入错误,则退出程序

//比较两个字符串是否相等,不能使用等号,应该使用库函数: strcmp\

//需要引用头文件

#include <string.h>

//如果返回值是 0,表示两个字符串相等

int main()

{

int i = 0;

int password[6] = { 0 };

//假设密码是字符 abcdef

for (i = 0; i < 3; i++)

{

printf("请输入密码:>");

scanf("%s", password); //数组不需要取地址

// if (password == "abcdef")

if (strcmp(password, "abcdef") == 0) //比较两个字符串是否相等,使用库函数 strcmp

{

printf("登录成功\n");

break;

}

else

{

printf("密码错误\n");

}

}

if (i == 3)

{

printf("三次密码均输入错误,退出程序");

}

return 0;

}

//今天共接触了三个新的头文件

/*

#include<windows.h>

Sleep(1000);// 1000单位是毫秒,需要引用头文件,#include<windows.h>

#include<stdlib.h>

system("cls");// system是一个库函数,可以执行系统命令, 需要引用头文件,#include<stdlib.h>

cls 清屏

#include <string.h>

if (strcmp(password ,"abcdef")==0) //比较两个字符串是否相等,使用库函数 strcmp

*/

相关推荐
mit6.8245 分钟前
[Cyclone] 哈希算法 | SIMD优化哈希计算 | 大数运算 (Int类)
算法·哈希算法
c++bug8 分钟前
动态规划VS记忆化搜索(2)
算法·动态规划
哪 吒10 分钟前
2025B卷 - 华为OD机试七日集训第5期 - 按算法分类,由易到难,循序渐进,玩转OD(Python/JS/C/C++)
python·算法·华为od·华为od机试·2025b卷
军训猫猫头1 小时前
1.如何对多个控件进行高效的绑定 C#例子 WPF例子
开发语言·算法·c#·.net
success1 小时前
【爆刷力扣-数组】二分查找 及 衍生题型
算法
Orlando cron2 小时前
数据结构入门:链表
数据结构·算法·链表
牛客企业服务2 小时前
2025年AI面试推荐榜单,数字化招聘转型优选
人工智能·python·算法·面试·职场和发展·金融·求职招聘
呜喵王阿尔萨斯3 小时前
编程中的英语
c语言·c++
糖葫芦君3 小时前
Policy Gradient【强化学习的数学原理】
算法