题目描述:将n个从小到大排序的整数(n<1000000)从1~n进行编号,并一个待查找的整数m,请使用二分法进行查找。 ####相关知识(略) ####编程要求根据提示,在右侧编辑器Begin-End处补充代码。 输入 输入包括3行,第一行为整数n,第二行包括n个整数,以空格分隔,第三行为整数m。 输出 如果能够在序列中找到整数m,则输出编号(如果存在多个编号,返回编号最小的),如果不存在,则输出None。c语言
时间: 2024-03-17 20:43:46 浏览: 88
百度之星05~08题目
以下是使用二分法进行查找的 C 代码实现:
```c
#include <stdio.h>
int main() {
int n, m;
scanf("%d", &n); // 输入整数n
int nums[n];
for (int i = 0; i < n; i++) {
scanf("%d", &nums[i]); // 输入n个整数并存储在数组nums中
}
scanf("%d", &m); // 输入待查找的整数m
int left = 0, right = n - 1; // 初始化左右指针
while (left <= right) {
int mid = (left + right) / 2; // 计算中间位置
if (nums[mid] == m) { // 如果找到了m
while (mid > 0 && nums[mid - 1] == m) { // 找到编号最小的位置
mid--;
}
printf("%d\n", mid + 1); // 输出编号(从1开始编号)
break;
}
else if (nums[mid] < m) { // 如果m在右半部分
left = mid + 1; // 更新左指针
}
else { // 如果m在左半部分
right = mid - 1; // 更新右指针
}
}
if (left > right) { // 如果没有找到m
printf("None\n");
}
return 0;
}
```
其中,left和right分别表示左右指针,mid表示中间位置。在每次循环中,首先计算mid的值,然后判断nums[mid]和m的大小关系,根据大小关系更新left和right的值。如果找到了m,再从mid开始向左遍历,找到编号最小的位置并输出,如果没有找到m,则输出None。
阅读全文