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、编写一个程序,输出2到500之间的所有完全数。所谓完全数,是指该数的各因子之和正好等于该数本身,例如:6=1+2+3;28=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,从而可以使用一重循环就可以解决问题。