一、二分查找(折半查找)算法
前提条件是数据是有序的
#include<stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int k = 3;
int sz = sizeof(arr)/sizeof(arr[0]);
int left = 0;
int right = sz-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\n",mid);
break;
}
}
if(left>right)
{
printf("找不到\n");
}
return 0;
}
注意点:int mid = (left + right) / 2;要在while之中
这句还可以改进为int mid = left + (right - left)/2;防止数据溢出;
及时break;
待改进:把固定输入改为可变输入(报错)
//2.21更新:
在VS编译器内应用scanf报错应该加#define _CRT_SECURE_NO_WARNINGS 头文件
C2065报错时应把所有定义提到函数之前
//
二、一个很有意思的代码:多个字符从两端移动且向中间汇聚
#include<stdio.h>
#include<string.h>
#include<windows.h>
#include<stdlib.h>
int main()
{
char arr1[] = "marry me!DU!!!";
char arr2[] = "##############";
int left = 0;
int right = strlen(arr2)-1;//int right = sizeof(arr1)/sizeof(arr1[1])-2
while(left <= right)
{
arr2[left] = arr1[left];
arr2[right] = arr1[right];
printf("%s\n",arr2);
Sleep(1000);//单位是秒
//清空屏幕
system("cls");//system是一个库函数,可以执行系统命令
left++;
right--;
}
printf("%s\n",arr2);
return 0;
}
注意:求字符串长度的两种方法sizeof和strlen的不同
strlen()头文件<string.h>,用来求字符串长度
Sleep()头文件<windows.h>,用来暂停代码运行
system("cls")头文件<stdlib.h>,用来清空屏幕;
三、密码登录
#include<stdio.h>
#include<string.h>
int main()
{
int i = 0;
char password[20] = { 0 };
for(i = 0; i < 3; i++)
{
printf("请输入密码:");
scanf("%s",password);
if(strcmp(password,"abcdef") == 0)
{
printf("登陆成功!");
break;
}
else
{
printf("密码错误。请重新输入!\n");
}
}
if(i == 3)
{
printf("错误三次,已锁定!!!!\n");
}
return 0;
}