#include"stdio.h"
#include"stdlib.h"
/*
辗转相除法:求两数的最大公约数
A与B数: 用A除以B得到一个余数C,再用 除数 除以 余数 得到新的余数
这个过程不断进行直到得到的余数为0 此时的除数就为最大公约数
*/
int division(int A, int B) { //参数位置含义: 第一个参数代表被除数 第二个参数代表除数
int C = A % B; //C代表A除以B的余数
if (C == 0) {
return B;
}
return division(B, C);
}
/*
折半查找: 对有序的数组进行
查找一个有序的数组,先比较中间的元素与要查找元素的大小,小的在前面找,大的从后面找
规定:当查找不到时为-1
*/
void sort(int* S, int N) {
for (int i = 0; i < N - 1; i++) {
for (int j = 0; j < N - 1 - i; j++) {
if (S[j] > S[j + 1]) {
int a = S[j + 1];
S[j + 1] = S[j];
S[j] = a;
}
}
}
}
int bisearch(int* S,int start, int end, int X) { //查找的值为X start和end标记着S的查找范围
if (start >= end) {
if (S[start] == X) {
return start;
}
return -1;
}
if (X > S[(start + end) / 2]) {
return bisearch(S, (start + end) / 2 + 1, end, X);
}
else if (X < S[(start + end) / 2]) {
return bisearch(S, start, (start + end) / 2 - 1, X);
}
else
return (start + end) / 2;
}
int main() {
int A, B;
printf("输入两个数: ");
scanf("%d %d", &A, &B);
printf("最大公因数为: %d\n", division(A, B));
printf("\n");
int N, X;
printf("输入数的大小:");
scanf("%d", &N);
int* S = (int*)malloc(sizeof(int) * N);
printf("输入N个数:");
for (int i = 0; i < N; i++) {
scanf("%d", &S[i]);
}
sort(S, N);
printf("排序后: ");
for (int i = 0; i < N; i++) {
printf("%d ", S[i]);
}
printf("\n");
printf("输入要查找的数X: ");
scanf("%d", &X);
printf("查找的数在数组中的下标: %d", bisearch(S, 0, N - 1, X)); //显示的是在数组中的下标而不是第几个数
free(S);
return 0;
}
- 注意二分查找法的前提条件: 为有序数组
- 注意二分查找的过程,也就理解了图二中为什么两个23,但查找的下标为0