本关任务:输入n (n<100)的值,以及n个从小到大排序的整数序列,再输入一个待查找的整数m,使用二分法进行查找该数的序号。 编程要求 输入:第一行为整数 n,第二行包括 n个整数,以空格分隔,第三行为墊数m. 输出:如果能够在序列中找到整数m,则输出其编号(编号从1开始,如果存在多个编号,则返回编号最小的),否则输出 None。c语言
时间: 2023-12-14 18:02:47 浏览: 96
实现思路:
1. 读入 n,表示序列的长度,读入 n 个整数作为序列,再读入 m,表示要查找的数。
2. 判断序列的中间位置 mid 的数是否等于 m,若是则返回 mid,若不是则判断 m 是否小于 mid 的数,若是则在序列的左半部分查找,否则在右半部分查找。
3. 每次查找时,将序列范围缩小为左闭右闭的区间,直到找到 m 或者区间为空。
代码实现:
```
#include <stdio.h>
int main() {
int n, m, a[100], left = 0, right, mid;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
scanf("%d", &m);
right = n - 1;
while (left <= right) {
mid = left + (right - left) / 2;
if (a[mid] == m) {
// 找到 m,返回编号
printf("%d\n", mid + 1);
return 0;
} else if (a[mid] > m) {
// m 在左半部分,缩小右端点
right = mid - 1;
} else {
// m 在右半部分,缩小左端点
left = mid + 1;
}
}
// 没有找到 m
printf("None\n");
return 0;
}
```
注意:
1. 序号从 1 开始,所以输出时需要加 1。
2. 如果没有找到 m,需要输出 "None" 而不是空行。
阅读全文