1、判断m是否为素数。
对于这个问题,首先分析素数的相关知识:素数只能被自身和1整除,即m只能被1和m整除,也就是说,只要m能被2~m-1中的某个数整除,那么它就不是素数;
然后,分析循环四个要素如下:
循环初始化条件:flag=1; i=2; //从这个问题来看,首先需要设置flag=1表示这个数初始默认为素数,然后循环遍历2~m-1中的某个数,看m是否能整除它,即遍历的第1个数是2,所以i=2。另外,还要输入一个m值。
循环判断条件:i<=m-1; //从上面问题来看,遍历的最后1个数是m-1,所以需要i<=m-1。
循环体: if(m%i==0) {flag=0; break;} // 从上面问题来看, 对于2~m-1中的某个数,看m是否能整除它,若能整除就不是素数,需要改变flag=0并跳出循环(找到1个就行了,没必要再找了),所以循环体为:if(m%i==0) {flag=0; break;}。
循环修正条件: i++; //从上面问题来看,为了进入下一轮循环,需要让这个数+1。
对于这种有数值区间范围遍历的问题,可以套用while语句循环结构或for语句循环结构(两种可以相互转换,见前面讲解),代码如下:
#include "stdio.h"
int main()
{
int m, i, flag;
printf("\nInput integer m: ");
scanf("%d",&m);
flag=1;
for(i=2;i<=m-1;i++)
{
if(m%i==0)
{
flag=0;
i=m;
}
}
if(flag==1)
printf("%d is prime\n",m);
else
printf ("%d is not prime\n",m);
return 0;
}
基于数学理论,上述问题可以优化为:只要m能被2~中的某个数整除,那么它就不是素数。因此代码可以为:
#include "stdio.h"
#include "math.h"
int main()
{
int m, i, flag;
printf("\nInput integer m: ");
scanf("%d",&m);
flag=1;
for(i=2;i<=sqrt(m);i++)
{
if(m%i==0)
{
flag=0;
i=m;
}
}
if(flag==1)
printf("%d is prime\n",m);
else
printf ("%d is not prime\n",m);
return 0;
}
注1:结果与上述代码结果是一致的。
注2:由于调用了根号数学函数sqrt(),所以需要包括math.h头文件。
2、求Fibonacci数列的前30项。
对于这个问题,首先分析Fibonacci(斐波纳契)数列定义:
Fibonacci(斐波纳契)数列定义如下:
数列第1项为1,第2项为1,从第3项开始,每项等于前两项之和。
Fib1=1; (n=1)
Fib2=1; (n=2)
Fibn=Fibn-1+Fibn-2 (n>=3)
即: 数列为:1,1,2,3,5,8, 13, …..
然后,分析循环四个要素如下:
循环初始化条件:f1=1; f2=1; i=3; //从这个问题来看,首先需要初始化前两项f1=1; f2=1,这样才能计算第3项。因为从第3项开始计算,所以需要初始化i=3。
循环判断条件:i<=30; //从上面问题来看,输出前30项,所以需要i<=30。
循环体: f=f1+f2; // 从上面问题来看, 从第3项开始,每1项都是前两项之和。
循环修正条件: f1=f2; f2=f; //从上面问题来看,为了进入下一轮循环,需要更新下一轮的前两项值 ,即下一轮的第1项是本轮的第2项,而下一轮的第2项是本轮的计算项。
对于这种有数值区间范围遍历的问题,可以套用while语句循环结构或for语句循环结构(两种可以相互转换,见前面讲解),代码如下:
#include "stdio.h"
int main()
{
long f; //值变得很大,所以使用长整型
int f1=1,f2=2,i;
printf("%10d%10d",f1,f2);
for(i=3;i<=30;i++)
{
f=f1+f2;
printf("%10ld",f);
f1=f2;
f2=f;
}
return 0;
}
注1:数值很快变得很大,所以定义了长整型来存储计算值。
3、用公式求π的近似值,直到最后一项的绝对值小于10-6为止。
对于这个问题,首先分析解题思路:
然后,分析循环四个要素如下:
循环初始化条件:s=1; n=1; t=1; pi=0; //从这个问题来看,首先初始化符号项、分母和每项计算值 ,对于第1项来说,s=1, n=1和t=1。此外,这是一个求和问题,所以需要初始求和值pi=0。
循环判断条件:fabs(t)>=1e-6; //从上面问题来看,要求每一项计算值t的绝对值大于等于10-6。
循环体: pi+=t // 从上面问题来看, 需要将每一项计算值t加起来,这个t包含正负号。
循环修正条件: s=-s; n=n+2; t=s/n; //从上面问题来看,为了进入下一轮循环,需要反转符号项,计算新的分母和新的项。
对于这种无数值区间范围遍历的问题,可以套用while语句循环结构,代码如下:
#include "stdio.h"
#include "math.h"
int main()
{
float t,pi,n;
int s;
s=1;
n=1;
t=1;
pi=0;
while(fabs(t)>=1e-6)
{
pi+=t;
s=-s;
n=n+2;
t=s/n;
}
pi=pi*4;
printf("pi=%10.6f\n",pi);
return 0;
}
注:由于调用了绝对值数学函数fabs(),所以需要包括math.h头文件。