鱼C论坛

 找回密码
 立即注册
查看: 1468|回复: 5

[已解决]为什么这份代码bing说可以正常运行,但是我的电脑陷入了死循环?

[复制链接]
发表于 2023-4-30 21:16:36 | 显示全部楼层 |阅读模式
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应该怎么实现呢?
最佳答案
2023-4-30 21:16:37
陈落轩 发表于 2023-4-30 21:18
大佬好,重新发了好像代码粘贴时有点问题

这个问题可能是因为输入数据的格式问题。如果在输入数据的时候,没有按照预期的格式输入,可能会导致死循环。确保在输入数据时,正确输入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。 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-30 21:16:37 | 显示全部楼层    本楼为最佳答案   
陈落轩 发表于 2023-4-30 21:18
大佬好,重新发了好像代码粘贴时有点问题

这个问题可能是因为输入数据的格式问题。如果在输入数据的时候,没有按照预期的格式输入,可能会导致死循环。确保在输入数据时,正确输入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");
    }
}

这个修改后的代码应该可以解决您的问题。请确保输入数据的正确性,并尝试在不同的编译器和平台上运行代码。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-30 21:17:22 | 显示全部楼层
你的代码就一句 include?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-4-30 21:18:16 | 显示全部楼层
isdkz 发表于 2023-4-30 21:17
你的代码就一句 include?

大佬好,重新发了好像代码粘贴时有点问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-4-30 22:34:45 | 显示全部楼层
isdkz 发表于 2023-4-30 21:16
这个问题可能是因为输入数据的格式问题。如果在输入数据的时候,没有按照预期的格式输入,可能会导致死循 ...

谢谢大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-30 22:35:43 | 显示全部楼层

不客气
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-18 03:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表