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

*/

相关推荐
爱吃生蚝的于勒1 小时前
C语言内存函数
c语言·开发语言·数据结构·c++·学习·算法
失落的香蕉4 小时前
C语言串讲-2之指针和结构体
java·c语言·开发语言
ChoSeitaku6 小时前
链表循环及差集相关算法题|判断循环双链表是否对称|两循环单链表合并成循环链表|使双向循环链表有序|单循环链表改双向循环链表|两链表的差集(C)
c语言·算法·链表
DdddJMs__1356 小时前
C语言 | Leetcode C语言题解之第557题反转字符串中的单词III
c语言·leetcode·题解
Fuxiao___6 小时前
不使用递归的决策树生成算法
算法
我爱工作&工作love我7 小时前
1435:【例题3】曲线 一本通 代替三分
c++·算法
娃娃丢没有坏心思7 小时前
C++20 概念与约束(2)—— 初识概念与约束
c语言·c++·现代c++
白-胖-子7 小时前
【蓝桥等考C++真题】蓝桥杯等级考试C++组第13级L13真题原题(含答案)-统计数字
开发语言·c++·算法·蓝桥杯·等考·13级
workflower7 小时前
数据结构练习题和答案
数据结构·算法·链表·线性回归
好睡凯7 小时前
c++写一个死锁并且自己解锁
开发语言·c++·算法