C语言之循环的嵌套

cbb58547a8064a1582e5e0b6d51bb260.jpg

  • 三种循环语句可互相嵌套,层数不限。
  • 外层循环可包含两个以上内循环,但不能相互交叉。
  • 嵌套的循环控制变量不能相同。

例1.编程求解1!+2!+……...+10!

问题分析:

采用双重for循环,整体共有10部分,对每一部分分别求阶乘。定义变量m用来存储每一部分的阶乘,sum用来存储各个部分之和。每次求阶乘后,m的值都会发生变化,所以在每部分进行阶乘前,需要对m重新赋值。所以m=1,需要放在第一重循环中,第二重循环前。

ad4f07a4ee794d99b6d17b67460e81c2.jpg

 代码如下:
#include<stdio.h>
void main()
{
   int i,j,sum=0,m;
   for(i=1;i<=10;i++)
      {
        m=1;
        for(j=1;j<=i;j++)
            m=m*j;
        sum=sum+m;
       }
    printf("结果是:%d",sum);
}

例2.打印输出如下所示左下三角形式的九九乘法表。

9466c4411c0740f8960bd35702e010b1.jpg

 问题分析:

根据计算机输出操作的特点,考虑采用双重for循环实现逐行输出每一列乘法表达式。


1.对乘法表进行整体分析。输出的乘法表共占9行,每一行表达式的个(列)数等于行数。因此,设定两个整型变量i和j,分别代表行号和列号则i∈[1,9],j∈[1,i]。


2.对每行每列的乘法表达式进行逐个分析,第i行第j列乘法表达式的被乘数等于行号i,乘数等于列号j。

3.为了实现图片中的排列形式,故每一行结束后,都需要换行。即第一重循环每进行一次,就需要输出一次换行符。

d34ec02f1d5649f1bb1b3f6f97bff5b1.jpg

代码如下:

#include<stdio.h>
void main()
{
   int i,j;
   for(i=1;i<=9;i++)
      {
        for(j=1;j<=i;j++)
            printf("%d*%d=%d ",i,j,i*j);
         printf("\n");
       } 
}

例3.给定1、2、3、4四个数字,输出所有由它们构成的无重复数字的三位数。

问题分析:

本例在1、2、3、4四个数字构成的三位数中找出那些无重复数字的三位数,这是典型的可以用穷举法求解的问题。三位数的百位、十位、个位都允许填入这4个数字。每一位用一个循环语句实现,则需要三层循环的嵌套,第一层测试百位,第二层测试十位,第三层测试个位,每一层循环4次。若用循环变量i,j,k分边表示百位、十位和个位的数字,则每个循环变量的取值是1、2、3、4。在最里层循环中,条件(i!=j&&i!=k&&j!=k)满足了题中的要求(无重复数字),表达式i*100+j*10+k形成了一个三位数。

ee4bf3dc8ce147e8a0bee64d00dc1725.jpg

 代码如下:

#include<stdio.h>
void main()
{
   int i,j,k;
   for(i=1;i<=4;i++)
      for(j=1;j<=4;j++)
         for(k=1;k<=4;k++)
            if(i!=k&&i!=j&&j!=k)
            printf("%d%d%d ",i,j,k);
}

例4.实现以下图形的输出。

ffa93da90e924b4b8c8822af992d4c25.jpg

问题分析:

观察图形,找出规律。定义行数i,空格随着行数增加,每次减一。星号随着行数增加,有2i-1的规律。通过第一重循环来控制行数,通过两个并列的循环,分别来控制空格和星号。

95510e448b5b4cb9be048465083e3932.jpg

代码如下:

#include<stdio.h>
void main()
{
   int i,j,k;
   for(i=1;i<=4;i++)
     {
      for(j=1;j<=4-i;j++)
         printf(" ");
      for(k=1;k<=2*i-1;k++)
         printf("*");
      printf("\n");
     }
}

例5.用循环的嵌套编程实现输出所有的“水仙花数”。

问题分析:

如果要用循环的嵌套来实现,我们自然的就可以想到用三个循环来表示百位,十位,个位。进而表示100到999之间的所有数。

b6e1c813ccae40d9b1bb7d17c07e3abc.jpg

代码如下:

#include<stdio.h>
void main()
{
   int i,j,k,n;
   printf("水仙花数是:");
   for(i=1;i<=9;i++)
      for(j=0;j<=9;j++)
          for(k=0;k<=9;k++)
             {
              n=100*i+10*j+k;
              if(n==i*i*i+j*j*j+k*k*k)
                printf("%d ",n);
              }  
}

对比:

bdb5676a51ab48ea8a9ced0566eb6595.jpg

6f006d23a5f3405ba6b08d816671986f.jpg

求水仙花数需要得知两个条件:某个数 和 这个数的个,十,百位。如果通过循环,则可以得到所有三位数,故通过三位数求每个位上的数。而循环的嵌套,则是先得知每个位上的数,来求所有的三位数。

 

 

 

  • 9
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值