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

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~\sqrt{m}中的某个数整除,那么它就不是素数。因此代码可以为:

#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)

  即: 数列为:112358,  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头文件。

  • 24
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值