鹏哥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

*/

相关推荐
泽虞14 分钟前
《LINUX系统编程》笔记p3
linux·运维·服务器·c语言·笔记·面试
欧阳小猜2 小时前
深度学习②【优化算法(重点!)、数据获取与模型训练全解析】
人工智能·深度学习·算法
你怎么知道我是队长2 小时前
C语言---编译的最小单位---令牌(Token)
java·c语言·前端
小欣加油2 小时前
leetcode 904 水果成篮
c++·算法·leetcode
有Li2 小时前
CXR-LT 2024:一场关于基于胸部X线的长尾、多标签和零样本疾病分类的MICCAI挑战赛|文献速递-深度学习人工智能医疗图像
论文阅读·人工智能·算法·医学生
君万2 小时前
【LeetCode每日一题】56. 合并区间
算法·leetcode·golang
墩墩同学2 小时前
【LeetCode题解】LeetCode 287. 寻找重复数
算法·leetcode·二分查找
小南家的青蛙3 小时前
LeetCode第55题 - 跳跃游戏
算法·leetcode·职场和发展
啊我不会诶3 小时前
CF每日4题(1500-1700)
c++·学习·算法
shuououo4 小时前
集成算法学习笔记
笔记·学习·算法