#include <stdio.h>
int main(void) {
int n, k, mid;
scanf("%d%d", &n, &k);
int a[n];
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
int left = 0;
int right = n - 1;
while (left <= right) {
mid = left + (right - left) / 2; //给mid赋值
if (a[mid] < k) {
left = mid + 1;
} else if (a[mid] > k) {
right = mid - 1;
} else if (a[mid] == k) {
while (mid < n - 1) { //限制循环范围
if (a[mid + 1] == a[mid]) {
mid += 1;
} else {
break;
}
}; //跳出循环
}
}
printf("%d\n", mid); //加上换行符
}
无论是dev-c++还是pta都会死循环,但bing说可以正常运行,请问是为什么?另外请问如果我想让目标数不在数组中的时候打印-1应该怎么实现呢?
这个问题可能是因为输入数据的格式问题。如果在输入数据的时候,没有按照预期的格式输入,可能会导致死循环。确保在输入数据时,正确输入n和k的值,然后正确输入n个数组元素。
关于目标数不在数组中时打印-1的问题,您需要在循环结束后判断一下是否找到了目标数。您可以在 while 循环之前设置一个标志变量(例如 int found = 0; ),如果找到目标数,将其设置为1。在循环结束后,根据这个标志变量来判断是否需要打印-1。
修改后的代码如下:
#include <stdio.h>
int main(void) {
int n, k, mid;
scanf("%d%d", &n, &k);
int a[n];
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
int left = 0;
int right = n - 1;
int found = 0;
while (left <= right) {
mid = left + (right - left) / 2; //给mid赋值
if (a[mid] < k) {
left = mid + 1;
} else if (a[mid] > k) {
right = mid - 1;
} else if (a[mid] == k) {
found = 1;
while (mid < n - 1) { //限制循环范围
if (a[mid + 1] == a[mid]) {
mid += 1;
} else {
break;
}
}; //跳出循环
break;
}
}
if (found) {
printf("%d\n", mid); //加上换行符
} else {
printf("-1\n");
}
}
这个修改后的代码应该可以解决您的问题。请确保输入数据的正确性,并尝试在不同的编译器和平台上运行代码。
|