C++如何跳出多层循环

最后更新于:2022-04-01 20:19:40

C++如何跳出多层循环 虽然说语言是互通的,各种计算机语言的基本逻辑结构是类似的,但不同的语言之间还是有一些差别的。如循环中的break,在java中可以后面带标志:**break [flag]**(flag为要结束的循环层数),但在C++中没有这个标志。 那C++中如何跳出多重循环呢? # 以问题为例:

问题主题:抽签

问题描述:

将写有数字的numOfCard个卡片放入口袋中,从口袋中抽取4次卡片,每次记录卡片的数字后将其放回口袋中。设卡片上写的数字为k1k2k3...kn,如果这4个数字的和为sum,则输出Yes,否则输出No

限制条件:

1<=numOfCard<=50

1<=sum<=108

1<=ki<=108

样例1

输入

numOfCard = 3

Sum = 10

K = {1, 3, 5}

输出

Yes

样例2

输入

numOfCard = 3

Sum = 9

K = {1, 3, 5}

输出

No

# 可能的解决方法 你可能会将程序写成这样:

void  drawLots() {

   //从标准输入读入

   int numOfCard, sum;

   int k[MAX_N];

   cout<<"输入numOfCardsum"<<endl;

   cin>>numOfCard>>sum; 

   cout<<"请输入这sum张卡片的数字"<<endl;

   for(int i=0; i<numOfCard; i++) {

cin>>k[i];

   }

   bool result = false;

   int _sum = 0;

   for(int a = 0; a < numOfCard; a ++) {

      for(int b = 0; b < numOfCard; b ++) {

          for(int c = 0; c < numOfCard; c++) {

              for(int d = 0; d < numOfCard; d ++) {

              _sum = k[a] + k[b] + k[c] + k[d];

                  if(_sum == sum) {

                    result = true;

                    break;

                  } 

              }

          }

      }

   }

   if(result){

   cout<<"Yes"<<endl;

   } else

    cout<<"No"<<endl;

}

# 出现的问题 **但是上面的break并没有结束循环(即没有跳出多层循环),而只是跳出了本层循环。**如果你不明白为什么会这样,可以参考我之前写的一篇文章:[再探java基础——break和continue的用法](http://blog.csdn.net/luoweifu/article/details/10756017) 或者,你可以将程序稍微改动一下来验证:

void  drawLots() {

   //从标准输入读入

   int numOfCard, sum;

   int k[MAX_N];

   cout<<"输入numOfCardsum"<<endl;

   cin>>numOfCard>>sum; 

   cout<<"请输入这sum张卡片的数字"<<endl;

   for(int i=0; i<numOfCard; i++) {

cin>>k[i];

   }

   bool result = false;

   int _sum = 0;

   for(int a = 0; a < numOfCard; a ++) {

      for(int b = 0; b < numOfCard; b ++) {

          for(int c = 0; c < numOfCard; c++) {

              for(int d = 0; d < numOfCard; d ++) {

              _sum = k[a] + k[b] + k[c] + k[d];

                  if(_sum == sum) {

                    result = true;

                    break;

                  } 

              }

          }

      }

   }

   cout << "_sum:" << _sum << "  " << "sum:" << sum << endl;

   if(result){

   cout<<"Yes"<<endl;

   } else

    cout<<"No"<<endl;

}

输入**样例1**,结果为: _sum:20  sum:10 Yes 原因:_sum:20是因为**break并没有结束循环(即没有跳出多层循环),而只是跳出了本层循环**,运行到循环最后一次时 k[a] == k[b] == k[c] == k[d] == 5; 那么,如何让程序跳出多重循环呢? # 我的解题思路是: **1. **java中有break [flat]的用法,可以解决这个问题,试了一下,但发现C++里不行,会报错,可能C++里没有这个用法;**2. **C/C++有个强制跳转的语法goto;**3. **加判断标志,不满足条件时逐层终止 # 我的解决方法: ### 一、使用goto

void  drawLots() {

   //从标准输入读入

   int numOfCard, sum;

   int k[MAX_N];

   cout<<"输入numOfCardsum"<<endl;

   cin>>numOfCard>>sum; 

   cout<<"请输入这sum张卡片的数字"<<endl;

   for(int i=0; i<numOfCard; i++) {

cin>>k[i];

   }

   bool result = false;

   int _sum = 0;

   for(int a = 0; a < numOfCard; a ++) {

      for(int b = 0; b < numOfCard; b ++) {

          for(int c = 0; c < numOfCard; c++) {

              for(int d = 0; d < numOfCard; d ++) {

              _sum = k[a] + k[b] + k[c] + k[d];

                  if(_sum == sum) {

                    result = true;

                    goto breakLoop;

                  } 

              }

          }

      }

   }

   breakLoop: cout << "_sum:" << _sum << "  " << "sum:" << sum << endl;

   if(result){

   cout<<"Yes"<<endl;

   } else

    cout<<"No"<<endl;

}

输入样例1. 结果: _sum:10  sum:10 Yes ### 二、加判断标志

void  drawLots() {

   //从标准输入读入

   int numOfCard, sum;

   int k[MAX_N];

   cout<<"输入numOfCardsum"<<endl;

   cin>>numOfCard>>sum; 

   cout<<"请输入这sum张卡片的数字"<<endl;

   for(int i=0; i<numOfCard; i++) {

cin>>k[i];

   }

   bool result = false;

   bool isBreakLoop = true;

   int _sum = 0;

   for(int a = 0; a < numOfCard && isBreakLoop; a ++) {

      for(int b = 0; b < numOfCard && isBreakLoop; b ++) {

          for(int c = 0; c < numOfCard && isBreakLoop; c++) {

              for(int d = 0; d < numOfCard && isBreakLoop; d ++) {

              _sum = k[a] + k[b] + k[c] + k[d];

                  if(_sum == sum) {

                      result = true;

                      isBreakLoop = false;

                  } 

              }

          }

      }

   }

   cout << "_sum:" << _sum << "  " << "sum:" << sum << endl;

   if(result){

   cout<<"Yes"<<endl;

   } else

    cout<<"No"<<endl;

}

输入样例1. 结果: _sum:10  sum:10 Yes ### 说明: 本人还是建议采用方法二,因为方法二更符合结构化的程序设计,使代码更整洁,可读性更强!我还是尽量避免使用goto。 欢迎加入"C/C++梦之队" 学习群:226157456
';