鹏哥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(arr0); // 求数组内元素个数,用了好几遍了

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

// {

// if (arri == 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(arr0);

int left = 0;

int right = size - 1;

while(left<=right)

{

int mid = (left + right) / 2;

if (arrmid < k)

{

left = mid + 1;

}

else if (arrmid > 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(arr0);//求元素个数

// 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 (arrmid < k)

// {

// left = mid + 1;

// }

// else if (arrmid > 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(arr10)-2; //先减去 \0, 再减去一个下标数

//

// while(left<=right)

// {

// arr2left = arr1left;

// arr2right = arr1right;

// 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 password6 = { 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

*/

相关推荐
1000世界小札3 小时前
《大话数据结构》第9章精读:归并排序与快速排序完整 C++ 实现
数据结构·c++·算法
2601_956121975 小时前
背包基础篇(01、完全、分组、多重、混合)
c++·算法·动态规划
兴通物联科技6 小时前
SMT PCB 微小 DataMatrix 码扫不动问题分析 兴通 XT8601B 600 万像素工业读码器落地实践
大数据·人工智能·单片机·嵌入式硬件·算法·计算机视觉
月华路9 小时前
G1 GC 对数组与大对象(Humongous)的处理
java·jvm·算法
我想走路带风9 小时前
LRU和最长前缀和(计算机网络算法)
计算机网络·算法
M78佐菲9 小时前
Linux学习笔记:进程
linux·笔记·学习·算法
徐小夕11 小时前
表格、文档、甘特、大屏、表单一站打通:pxcharts超级表格4.0正式上线!
前端·算法·github
TechLee12 小时前
跨语言加解密总对不上?这个纯 Go 神库让 AES/RSA 与 PHP、Java 100% 互通
java·后端·算法
qq_5896660513 小时前
C语言、C++与C#的区别详解
c语言·c++·c#