1、求n! 。
对于这个问题,首先分析四个要素如下:
循环初始化条件:i=1; fact=1; //n!=1*2*3*...*n,从这个问题来看,首先需要乘起来的数有n个,第一个即i=1,然后需要fact来存储乘起来的数(初始时fact=1,因为是乘法)。另外,还要输入一个n值。
循环判断条件:i<=n; //从上面问题来看,要乘起来数是n个,所以需要i<=n。
循环体: fact*=i; // 从上面问题来看, 对于每一个数需要乘起来,刚好第i个数就是i,所以fact=fact*i。
循环修正条件: i++; //从上面问题来看,为了进入下一轮循环,需要让这个数+1。
对于这种有数值区间范围遍历的问题,可以套用while语句循环结构或for语句循环结构(两种可以相互转换,见前面讲解),代码如下:
#include "stdio.h"
int main()
{
int i, fact=1, n;
printf("Please input n:");
scanf("%d", &n);
for( i=1;i<=n;i++ )
fact*=i;
printf("%d!=%d\n", n,fact);
return 0;
}
2、求1*3*5*...*(2n-1)。
这个问题与上面类似,但是每个数与i不相等,需要另计算。
对于这个问题,首先分析四个要素如下:
循环初始化条件:i=1; fact=1; //从上面问题来看,首先需要乘起来的数有n个,第一个即i=1,然后需要fact来存储乘起来的数(初始时fact=1,因为是乘法)。另外,还要输入一个n值。
循环判断条件:i<=n; //从上面问题来看,要乘起来数是n个,所以需要i<=n。
循环体: fact*=(2*i-1); // 从上面问题来看, 对于每一个数需要乘起来,第i个数不是i,而是2*i-1,所以fact=fact*(2*i-1)。
循环修正条件: i++; //从上面问题来看,为了进入下一轮循环,需要将i+1。这时,可以理解i为循环次数,并建立需要乘起来的数与循环次数之间的关系为:2*i-1。
对于这种有数值区间范围遍历的问题,可以套用while语句循环结构或for语句循环结构(两种可以相互转换,见前面讲解),代码如下:
#include "stdio.h"
int main()
{
int i, fact=1, n;
printf("Please input n:");
scanf("%d", &n);
for( i=1;i<=n;i++ )
fact*=(2*i-1);
printf("fact=%d", fact);
return 0;
}
3、求输入的10个数中的最大值或最小值。
对于这个问题,首先分析四个要素如下:
循环初始化条件:scanf("%f",&x); max; //从上面问题来看,首先输入一个数x才能考虑是否为最大值,然后需要max来存储最大值(初始时max=x,即第一个数x为最大值,因为目前只有一个数)。另外,需要输入10个数,因为第一个数已输入并赋给max,那接下来要输入第二个数,所以i=2。
循环判断条件:i<=10; //从上面问题来看,要输入的数是10个,所以需要i<=10。
循环体: scanf("%f",&x); if(max<x) max=x; // 从上面问题来看,对于每一个输入的数x,需要与max进行比较,若新输入的x大于目前的max,则更新max=x。
循环修正条件: scanf("%f",&x); //从上面问题来看,为了进入下一轮循环,需要输入下一个数。
对于这种有数值区间范围遍历的问题,可以套用while语句循环结构或for语句循环结构(两种可以相互转换,见前面讲解),代码如下:
#include "stdio.h"
int main()
{
float x;
int i;
float max;
printf("输入第1个数:");
scanf("%f", &x);
max =x;
for(i=2;i<=10;i++)
{
printf("输入第%d个数:", i);
scanf("%f", &x);
if(x> max) max=x;
}
printf("最大值=%f\n", max);
return 0;
}
注:求最小值也是类似的,只需要将max改为min,以及将x>max改为x<min即可;