꧁꫞꯭星꯭空꯭꫞꧂ 2023-03-25 11:01 采纳率: 66.7%
浏览 16
已结题

关于break的问题

下面的break为什么而没有跳出循环呢
输入n=6的时候,本来结果是13,但是编译器却输出了19,问题就在break没有跳出循环

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n = 0;
    int i, j;
    scanf("%d", &n);
    
    int a[100][100] = { 0 };
    for (i = 0; i < n; i++)
    {
        for ( j = 0; j < i + 1; j++)
        {
            if (i == 0 && j == 0)
                a[i][j] = 1;
            else if (j == 0 || i == j)
                a[i][j] = 1;
            else
            {
                a[i][j] = a[i - 1][j - 1] + a[i - 1][j];
            }
        }
    }

      for (i = 0; i < n; i++)
      {
          for (j = 0; j < i + 1; j++)
        {
              printf("%d ",a[i][j]);
        } 
        printf("\n");
      }

    int count = 0;

    for (i = 0; i < n; i++)
    {
        for ( j = 0; j < i + 1; j++)
        {
            count++;
            if (n == a[i][j])
            {
                break;
            }
        }
    }
    printf("%d", count);
    return 0;
}

  • 写回答

2条回答 默认 最新

  • IT_service_mesh 2023-03-25 11:27
    关注

    参考GPT和自己的思路:在代码中,break语句只会跳出最内层的循环,即第二个for循环。因此,当找到第一个等于n的元素时,只会跳出第二个for循环,然后继续执行最外层的for循环。这样,虽然已经找到了n所在的位置,但是跑完了所有的循环,导致count值被错误地累加了一遍,所以输出的结果为19而不是13。如果想要在找到第一个等于n的元素后立即跳出最外层的循环,可以使用标记(flag)来实现。在循环前定义一个标记flag(初始值为0),当找到第一个等于n的元素时将flag的值改为1,并且在第二个for循环结束时检查flag的值是否为1,如果是就跳出最外层的for循环,否则继续执行。具体的代码实现如下:

    int count = 0;
    int flag = 0; // 新增一个标记flag
    
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < i + 1; j++)
        {
            count++;
            if (n == a[i][j])
            {
                flag = 1; // 找到了n,将flag设置为1
                break;
            }
        }
    
        if (flag == 1) // 如果flag被设置为1,跳出最外层的for循环
        {
            break;
        }
    }
    
    printf("%d", count);
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月2日
  • 已采纳回答 3月25日
  • 创建了问题 3月25日