C语言程序设计-[16] 循环结构的一些应用(续)

 1、编程显示以下图形(共n行,n由键盘输入)

   *

   * *

   * * *

   * * * *

   * * * * *

对于这个问题,首先进行如下分析:

因此,首先要循环每一行,然后针对每一行要循环每一个*号,即可用双重循环来解决。

根据上述分析,循环四个要素如下:

循环初始化条件:i=1;  //从上面问题来看,对于第1行,即i=1。另外,还要输入一个n值。

循环判断条件:i<=n;  //从上面问题来看,遍历的最后一行即n,所以需要i<=n。

循环体: 输出第i行的*号并回车换行  // 从上面问题来看, 这个由内循环来处理。

循环修正条件: i++;   //从上面问题来看,为了进入下一轮循环,需要让这个行数+1。

根据上述分析,内循环四个要素如下:

循环初始化条件:j=1;  //从上面问题来看,对于第i行,打印第1个*号即j=1。

循环判断条件:j<=i;  //从上面问题来看,对于第i行,打印的*号数刚好是i个,所以需要j<=i。

循环体: printf("*");  // 从上面问题来看, 输出第j个*号。

循环修正条件: j++;   //从上面问题来看,为了进入下一轮循环,需要让这个数+1。

对于这种有数值区间范围遍历的问题,可以套用while语句循环结构或for语句循环结构(两种可以相互转换,见前面讲解),代码如下:

#include "stdio.h"

int main()
{   
    int i,j,n;
    printf("\nplease input lines:");
    scanf("%d",&n);
    for(i=1; i<=n; i++)
    {   
        for(j=1; j<=i; j++)
            printf("*");
        printf("\n");
    }
    return 0;
}

注:如果打印图形形状是下面形状(包含打印空格符和*号符):

解决这个问题的方法与上面是相同的,外循环还是循环每一行,内循环有两个:第一个是循环输出这一行的空格符;第二个是循环输出这一乖的*号符。关键在于构成行号与空格数、*号数的关系,见上面分析。因此,代码修改如下:

#include "stdio.h"

int main()
{   
    int i,j,n;
    printf("\nplease input lines:");
    scanf("%d",&n);
    for(i=1; i<=n; i++)
    {   
        for(j=1; j<=n-i; j++)
            printf(" ");
        for(j=1; j<=2*i-1; j++)
            printf("*");
        printf("\n");
    }
    return 0;
}

2、编写一个程序,输出2500之间的所有完全数。所谓完全数,是指该数的各因子之和正好等于该数本身,例如:6=1+2+328=1+2+4+7+14

对于这个问题,首先分析循环四个要素如下:

循环初始化条件:m=2;  //从上面问题来看,对于遍历寻找的第1个数是2,即m=2。

循环判断条件:m<=500;  //从上面问题来看,遍历的最后一个数是500,即m<=500。

循环体: 计算m的所有因子并加起来得到s,然后判定是否等于自身,即if(s==m) printf("%d ",m);  // 从上面问题来看, 这个"计算m的所有因子并加起来得到s"由内循环来处理。

循环修正条件: m++;   //从上面问题来看,为了进入下一轮循环,需要让这个数+1。

然后分析内循环四个要素如下:

循环初始化条件:i=1; s=0;  //从上面问题来看,对于m,第一个循环的因子i是1,而初始因子之和s为0。

循环判断条件:i<=m/2;  //从上面问题来看,对于m,除自身之外最大的因子就是m/2,所以循环的因子i<=m/2。

循环体: if(m%i==0) s+=i;   //从上面问题看来,对于m的每一个因子都加起来。

循环修正条件: i++;   //从上面问题来看,为了进入下一轮循环,需要让这个因子数+1。

对于这种有数值区间范围遍历的问题,可以套用while语句循环结构或for语句循环结构(两种可以相互转换,见前面讲解),代码如下:

#include "stdio.h"

int main()
{
    int m,i,s;
    for(m=2;m<=500;m++)
    {
    	s=0;
    	for(i=1;i<=m/2;i++)
    		if(m%i==0) s+=i;
    	if(s==m) printf("%d ",m);
	}
	return 0;
}

3、编写程序实现用一元人民币换成一分、两分、五分的硬币共50

对于这个问题,与鸡兔问题相似,可以分别循环一分、二分和五分硬币的数目,我就不细讲了,直接给出代码。对于三重降二重、一重实现,无非是利用数学求解。


#include "stdio.h"

int main()
{   int i, j, k;
    for(i=0; i<=50; i++)
		for(j=0; j<=50; j++)
    	{
	    	for(k=0; k<=50;k++)
	   		{	
	        	if(i+j+k==50 && i+2*j+5*k ==100)
		        	printf("%d,%d,%d\n",i,j,k);
	    	}
    	}
}

注:上面i,j,k分别代表一分、二分和五分硬币的数目。对于五分硬币,最多20枚就足一元,所以k<=20即可。


#include "stdio.h"

int main()
{   int i, j, k;
    for(i=0; i<=50; i++)
	   for(j=0; j<=50; j++)
	   {
            k=50-i-j;
            if( i+2*j+5*k ==100)
		    	printf("%d,%d,%d\n", i,j,k); 
        }
    return 0;
}

注:k由i和j来计算得到。

#include "stdio.h"

int main()
{   
    int i, j, k;
    for(k=0; k<13; k++)	
    {      
	   j=50-4*k;
	   i=50-j-k;
	   printf("%d,%d,%d\n", i,j,k); 
    }
    return 0;
}

注:

下式减上式得到:y+4z=50,其中z为五分硬币数目。在这个公式中,z最多不超过13。因此,可以循环z,然后利用z计算y,最后利用y和z计算x,从而可以使用一重循环就可以解决问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值