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

*/

相关推荐
xiaobai12 32 分钟前
二叉树的遍历【C++】
开发语言·c++·算法
吱吱鼠叔27 分钟前
MATLAB数学规划:2.线性规划
算法·机器学习·matlab
声学黑洞仿真工作室35 分钟前
Matlab Delany-Bazley和Miki模型预测多孔材料吸声性能
开发语言·人工智能·算法·matlab·微信公众平台
机器学习之心39 分钟前
选址模型 | 基于混沌模拟退火粒子群优化算法的电动汽车充电站选址与定容(Matlab)
算法·选址模型
MogulNemenis1 小时前
力扣春招100题——队列
数据结构·算法·leetcode
码上一元1 小时前
【百日算法计划】:每日一题,见证成长(017)
java·算法
LaoWaiHang2 小时前
C语言从头学61——学习头文件signal.h
c语言
菜鸟求带飞_2 小时前
算法打卡:第十一章 图论part01
java·数据结构·算法
浅念同学2 小时前
算法.图论-建图/拓扑排序及其拓展
算法·图论
Antonio9152 小时前
【CMake】使用CMake在Visual Studio内构建多文件夹工程
开发语言·c++·visual studio