1 循环嵌套

1 引入

 经过前面的内容,我们已经掌握了信息学的基础知识。


这次的内容是基础班的最后一块内容,循环嵌套


循环嵌套没有新的知识点,只是循环结构的一种用法介绍。


让我们走进今天的内容看一下吧!

2 循环嵌套

从名字来理解,循环嵌套就是:循环嵌套循环,就是在循环语句里面写循环语句


一个循环靠一个变量控制,一个循环嵌套至少由两个循环语句组成,从而实现更多丰富的功能。


如果有两个循环,我们可以称之为两层循环。外面的称为外层循环,里面的称为内层循环


举个例子:


#include<iostream>
using namespace std;
int main(){
  
  for(int a = 1;a<5;a++){
    cout<<"【第"<<a<<"行】"<<endl;
    for(int b = 1;b<5;b++){
      cout<<"第"<<b<<"列 ";
    }
    cout<<endl;
  }
    
  return 0;
}


执行结果如下:


C++总结 | 16 循环嵌套及其应用_c++


3 注意点

我们以for循环为例,如果我们有两层循环!外层循环和内层循环都做100次,那对于整个循环来说就做了10000次。


比如我们下面的例子:


两个大于0的整数,它们相加得100,相减得36,这两个整数是多少?


最简单的,我们的程序如下:



#include<iostream>
using namespace std;
int main(){
  int a = 0;
  for(int x=0;x<100;x++){
    for(int y=0;y<100;y++){
      a++;
      cout<<"执行了第"<<a<<"次"<<endl;
      if(x+y==100&&x-y==36)
        cout<<"x = "<<x<<",y = "<<y<<endl;
    }
  }
      
  return 0;
}


代码部分输出如下:



在后面的情况中,我们可能遍历不止100次,可能用到不止两层循环。那整体来说,循环就执行了太多次。


虽然循环嵌套真的能帮我们实现很多功能,但是我们应该限制使用,并且在使用过程中,尽可能的去控制循环的层数、每层循环的次数


那上面的代码我们可以分析一下,x-y = 36,则说明x>y,x+y = 100,那我们可以取 x 最小为 51,即x最起码要大于两个数的平均数。y最大为49,即y最起码要小于两个数的平均数。


所以我们上面的代码可以优化为:


#include<iostream>
using namespace std;
int main(){
  int a = 0;
  for(int x=51;x<100;x++){
    for(int y=0;y<50;y++){
      a++;
      cout<<"执行了第"<<a<<"次"<<endl;
      if(x+y==100&&x-y==36)
        cout<<"x = "<<x<<",y = "<<y<<endl;
    }
  }
      
  return 0;
}


执行结果如下:


这样就只用执行2450次就可以了。


如果我们明确,方程只有一个解,那我们找到解之后就可以break,就会再简化代码。

2 循环嵌套应用

循环嵌套最主要的就是应用,我们这里讲几个比较重要的应用。

1 乘法口诀表

输出乘法口诀表,代码如下:


#include<iostream>
using namespace std;

int main(){
  
  for(int i = 1;i<10;i++){
    for(int j = 1;j<=i;j++){
      cout<<j<<"*"<<i<<"="<<j*i<<"\t"//制表符tab
    }
    cout<<endl;
  }
  
  return 0;
}


执行结果如下:


2 三角形

我们可以输出三角形 。


第一种情况:


#include<iostream>
using namespace std;

int main(){
  
  for(int i = 1;i<=5;i++){
    for(int j = 1;j<=i;j++){
      cout<<"* ";
    }
    cout<<endl;
  }
  
  return 0;
}


执行结果如下:



第二种情况:


#include<iostream>
using namespace std;

int main(){
  
  for(int i = 1;i<=5;i++){
    for(int j = 1;j<=6-i;j++){
      cout<<"* ";
    }
    cout<<endl;
  }
  
  return 0;
}


执行结果如下:



第三种情况:


#include<iostream>
using namespace std;

int main(){
  
  for(int i = 1;i<=5;i++){
    for(int j = 1;j<=5;j++){
      if(j<i) cout<<" ";
      else cout<<"* ";
    }
    cout<<endl;
  }
  
  return 0;
}


执行结果如下:



第四种情况:


#include<iostream>
using namespace std;

int main(){
  
  for(int i = 1;i<=5;i++){
    for(int j = 1;j<=5;j++){
      if(j<6-i) cout<<" ";
      else cout<<"* ";
    }
    cout<<endl;
  }
  
  return 0;
}


执行结果如下:


C++总结 | 16 循环嵌套及其应用_c++_02

3 菱形

我们也可以输出菱形!


代码如下:


#include<iostream>
using namespace std;

int main(){
  int k;
  cin>>k;
  for(int x = 1;x<=2*k-1;x++){
    for(int y = 1;y<=2*k-1;y++){
      if(x+y<3*k && x+y>k && x-y<k && y-x<k) cout<<"* ";
      else cout<<" ";
       
    }
    cout<<endl;
  }
  
  return 0;
}


执行结果如下:

C++总结 | 16 循环嵌套及其应用_c++_03

4 输出n以内所有素数

输入一个数,输出这个数以内的所有素数 。


代码如下:


#include<iostream>
using namespace std;

int main(){
  int k,i = 0;
  cin>>k;
  bool flag = true;
  
  for(int x = 2;x<=k;x++){
    for(int y = 2;y*y<=x;y++){
      if(x%y == 0) {
        flag = false;
        break;
      }
    }
    if(flag) {
      cout<<x<<"\t";
      i++;
      if(i%5 == 0cout<<endl//每输出5个换一次行
  }
  
    flag = true;
    
  }
  
  return 0;
}


执行结果如下:


C++总结 | 16 循环嵌套及其应用_c++_04


3 习题

根据今天讲的内容,完成下面的两道习题。

1 鸡兔同笼

一个笼子中只有鸡和兔子,有50只脚,18个头,求笼中各有几只鸡和兔?


要求用循环嵌套实现。

2 四次方和

计算前n个数的四次方的和:


1x1x1x1+2x2x2x2+3x3x3x3+4x4x4x4+......n*n*n*n


的和。n通过键盘输入。