鱼C论坛

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

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

[复制链接]
发表于 2023-4-30 21:16:36 | 显示全部楼层 |阅读模式
20鱼币

  1. #include <stdio.h>

  2. int main(void) {
  3.         int n, k, mid;
  4.         scanf("%d%d", &n, &k);
  5.         int a[n];
  6.         for (int i = 0; i < n; i++) {
  7.                 scanf("%d", &a[i]);
  8.         }
  9.         int left = 0;
  10.         int right = n - 1;
  11.         while (left <= right) {
  12.                 mid = left + (right - left) / 2; //给mid赋值
  13.                 if (a[mid] < k) {
  14.                         left = mid + 1;
  15.                 } else if (a[mid] > k) {
  16.                         right = mid - 1;
  17.                 } else if (a[mid] == k) {
  18.                         while (mid < n - 1) { //限制循环范围
  19.                                 if (a[mid + 1] == a[mid]) {
  20.                                         mid += 1;
  21.                                 } else {
  22.                                         break;
  23.                                 }
  24.                         }; //跳出循环
  25.                 }
  26.         }
  27.         printf("%d\n", mid); //加上换行符
  28. }
复制代码


无论是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。

修改后的代码如下:

  1. #include <stdio.h>

  2. int main(void) {
  3.     int n, k, mid;
  4.     scanf("%d%d", &n, &k);
  5.     int a[n];
  6.     for (int i = 0; i < n; i++) {
  7.         scanf("%d", &a[i]);
  8.     }
  9.     int left = 0;
  10.     int right = n - 1;
  11.     int found = 0;
  12.     while (left <= right) {
  13.         mid = left + (right - left) / 2; //给mid赋值
  14.         if (a[mid] < k) {
  15.             left = mid + 1;
  16.         } else if (a[mid] > k) {
  17.             right = mid - 1;
  18.         } else if (a[mid] == k) {
  19.             found = 1;
  20.             while (mid < n - 1) { //限制循环范围
  21.                 if (a[mid + 1] == a[mid]) {
  22.                     mid += 1;
  23.                 } else {
  24.                     break;
  25.                 }
  26.             }; //跳出循环
  27.             break;
  28.         }
  29.     }
  30.     if (found) {
  31.         printf("%d\n", mid); //加上换行符
  32.     } else {
  33.         printf("-1\n");
  34.     }
  35. }
复制代码


这个修改后的代码应该可以解决您的问题。请确保输入数据的正确性,并尝试在不同的编译器和平台上运行代码。

最佳答案

查看完整内容

这个问题可能是因为输入数据的格式问题。如果在输入数据的时候,没有按照预期的格式输入,可能会导致死循环。确保在输入数据时,正确输入n和k的值,然后正确输入n个数组元素。 关于目标数不在数组中时打印-1的问题,您需要在循环结束后判断一下是否找到了目标数。您可以在 while 循环之前设置一个标志变量(例如 int found = 0; ),如果找到目标数,将其设置为1。在循环结束后,根据这个标志变量来判断是否需要打印-1。 ...
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

这个问题可能是因为输入数据的格式问题。如果在输入数据的时候,没有按照预期的格式输入,可能会导致死循环。确保在输入数据时,正确输入n和k的值,然后正确输入n个数组元素。

关于目标数不在数组中时打印-1的问题,您需要在循环结束后判断一下是否找到了目标数。您可以在 while 循环之前设置一个标志变量(例如 int found = 0; ),如果找到目标数,将其设置为1。在循环结束后,根据这个标志变量来判断是否需要打印-1。

修改后的代码如下:

  1. #include <stdio.h>

  2. int main(void) {
  3.     int n, k, mid;
  4.     scanf("%d%d", &n, &k);
  5.     int a[n];
  6.     for (int i = 0; i < n; i++) {
  7.         scanf("%d", &a[i]);
  8.     }
  9.     int left = 0;
  10.     int right = n - 1;
  11.     int found = 0;
  12.     while (left <= right) {
  13.         mid = left + (right - left) / 2; //给mid赋值
  14.         if (a[mid] < k) {
  15.             left = mid + 1;
  16.         } else if (a[mid] > k) {
  17.             right = mid - 1;
  18.         } else if (a[mid] == k) {
  19.             found = 1;
  20.             while (mid < n - 1) { //限制循环范围
  21.                 if (a[mid + 1] == a[mid]) {
  22.                     mid += 1;
  23.                 } else {
  24.                     break;
  25.                 }
  26.             }; //跳出循环
  27.             break;
  28.         }
  29.     }
  30.     if (found) {
  31.         printf("%d\n", mid); //加上换行符
  32.     } else {
  33.         printf("-1\n");
  34.     }
  35. }
复制代码


这个修改后的代码应该可以解决您的问题。请确保输入数据的正确性,并尝试在不同的编译器和平台上运行代码。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-4-30 21:17:22 | 显示全部楼层
你的代码就一句 include?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

大佬好,重新发了好像代码粘贴时有点问题
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

谢谢大佬
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

不客气
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-10 09:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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