|
20鱼币
- #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");
- }
- }
复制代码
这个修改后的代码应该可以解决您的问题。请确保输入数据的正确性,并尝试在不同的编译器和平台上运行代码。
|
最佳答案
查看完整内容
这个问题可能是因为输入数据的格式问题。如果在输入数据的时候,没有按照预期的格式输入,可能会导致死循环。确保在输入数据时,正确输入n和k的值,然后正确输入n个数组元素。
关于目标数不在数组中时打印-1的问题,您需要在循环结束后判断一下是否找到了目标数。您可以在 while 循环之前设置一个标志变量(例如 int found = 0; ),如果找到目标数,将其设置为1。在循环结束后,根据这个标志变量来判断是否需要打印-1。
...
|