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;
}
执行结果如下:
我们以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 循环嵌套应用
循环嵌套最主要的就是应用,我们这里讲几个比较重要的应用。
输出乘法口诀表,代码如下:
#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;
}
执行结果如下:
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;
}
执行结果如下:
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 == 0) cout<<endl; //每输出5个换一次行
}
flag = true;
}
return 0;
}
执行结果如下:
3 习题
根据今天讲的内容,完成下面的两道习题。
1 鸡兔同笼一个笼子中只有鸡和兔子,有50只脚,18个头,求笼中各有几只鸡和兔?
要求用循环嵌套实现。
计算前n个数的四次方的和:
1x1x1x1+2x2x2x2+3x3x3x3+4x4x4x4+......n*n*n*n