二分查找
无序的数组不能进行二分查找,升序或者降序可以

cpp
#include<stdio.h>
int main() {
int a[] = { 1,2,3,4,5,6,7,8,9,10 };
int k = 7;//k为要在数组中找的数
int i = 0;
int sz = sizeof(a) / sizeof(a[0]);
int flag = 0;
int left = 0;
int right = sz - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (a[mid] < k)
{
left = mid + 1;//因为原数组是升序,所有mid小于k就要往后面进行二分查找
}
else if (a[mid] > k)
{
right = mid + 1;
}
else
{
flag = 1;
printf("找到了,下标是%d\n", mid);
break;
}
}
if (flag == 0)
printf("找不到了\n");
return 0;
}
查找数组中一个元素的下标

strlen不算\0,下标从0开始所以求最后一个元素下标要-1
sizeof算\0,下标从0开始所以要-2
辗转相除法求最大公约数
cpp
#include<stdio.h>
int main()
{
int a = 24;
int b = 18;
int c = a % b;
while (c != 0)
{
a = b;
b = c;
c = a % b;
}
printf("%d\n", b);
return 0;
}

一个关键数学结论:两个数的最大公约数,等于其中较小数与两数之差的最大公约数。
进一步优化(避免多次减法):两个数的最大公约数,等于其中较小数与两数相除余数的最大公约数。
c一直存放余数,a一直存放较大的数,b一直存放较小的数
函数的设计应追求高内聚低耦合
模块之间要紧密相关,形成一个高效的功能单元
完成一个功能可能需要多个模块一直完成,我们期望模块与模块之间不要有太强关联(即独立)