C++如何跳出多层循环

12 篇文章 1 订阅
11 篇文章 45 订阅

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基础——breakcontinue的用法

或者,你可以将程序稍微改动一下来验证:

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++有个强制跳转的语法goto3. 加判断标志,不满足条件时逐层终止

我的解决方法:

一、使用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





评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陌尘(MoChen)

爱打赏的人技术成长更开哦~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值