您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 数据通信与网络 > C语言高级教程计算机算法初步
第3章计算机算法初步3.3递推与迭代法3.2穷举法3.1算法的概念3.1算法的概念利用计算机求解问题的一般过程(1)问题分析阶段(2)数据结构设计阶段(3)算法设计阶段(4)编码与调试阶段算法描述在计算机科学的发展过程中,人们已经提出了很多种类的算法描述方法。一种是自然语言的描述方法。鉴于自然语言本身过于灵活且又缺乏严谨性,所以容易产生理解上的歧义。还有一种算法的图形描述方式——流程图。它采用一些标准的图形符号描述算法的操作过程,从而避免了人们对非形式化语言的理解差异。起止框I/O框处理框判断框调用框连接框有向边常用流程图符号例1:求解一元二次方程问题分析假设一元二次方程可以书写成ax2+bx+c=0。可以看出,任何一个一元二次方程都由三个系数a、b、c惟一确定,所以,首先需要用户输入三个系数,然后再根据一元二次方程的求解规则计算最终的结果,并将结果显示输出。算法描述NNYY开始输入a,b,cb2-4actt0t=0结束输出一个解输出“无解”输出两个解#includestdio.h#includemath.hmain(){inta,b,c,t;doublet0;printf(“Inputa,b,c:”);scanf(“%d%d%d”,&a,&b,&c);t=b*b–4*a*c;if(t0)printf(“Nosolution\n”);elseif(t==0)printf(“X=%lf\n”,-b/(2.0*a));else{/*doublet0;*/t0=sqrt((double)t);printf(“X1=%lf,X2=%lf\n”,(-b+t0)/(2*a),(-b-t0)/(2*a));}}程序代码3.2穷举法概述穷举法,又称为枚举法,是人们日常生活中常用的一种求解问题的方法。例如,从某个班中找出所有班干部,需要逐一对每个同学进行查看,判断是否是班干部。这种方法的基本思路就是一一列举每个可能性,逐个进行排查。因此,穷举法的核心在于明确问题的所有可能性,并针对每种可能情况逐个进行判断,最终找出正确问题的答案。穷举法应用实例1:素数的判断所谓素数是指仅能被1和自身整除,且大于等于2的数值。判断一个给定的数值是否是素数是穷举法的典型实例。例2:判断给定整数是否是素数。问题分析为了检查一个整数是不是素数,可以采用穷举法。假设给定的整数用x表示,则判断过程就是确认x不能整除以2~x-1之间的任何整数。这就需要一一列举出2~x-1之间的每个整数进行排查。算法描述NY开始输入x2ttxt加1x%t==0结束输出“不是素数”输出“是素数”YNt==xYN#includestdio.hmain(){intx,t;printf(“Enteraninteger:”);scanf(“%d”,&x);for(t=2;tx;t++)/*列举小于x大于1的所有整数*/if(x%t==0)break;if(t==x)/*是否通过循环条件出口*/printf(“%disprime\n”,x);elseprintf(“%disn’tprime\n”,x);}程序代码穷举法应用实例2:百钱买百鸡“百钱买百鸡”是我国古代数学家张丘建提出的一个著名的数学问题。假设某人有钱百枚,希望买一百只鸡;不同的鸡价格不同,公鸡5枚钱一只,母鸡3枚钱一只,而小鸡3只1枚钱。试问:如果用百枚钱买百只鸡,可以包含几只公鸡、几只母鸡和几只小鸡。例3:百钱买百鸡。问题分析从题目要求可知:公鸡、母鸡和小鸡的数量是有限的,都不会超过100。通过对不同数量的公鸡、母鸡和小鸡进行组合,可以计算出购买这些鸡所用的花费,但这个题目要求找出那些花费正好100枚且鸡的总数也为100只的情况。因此,可以采用穷举法,将不同的公鸡、母鸡和小鸡的数量枚举一遍,找出那些符合题目要求的解。算法描述NY开始条件判断x加1结束z=100x=100/5y=100/3y加1z加10x0y0z输出x,y,zNYYNNY#includestdio.h#includemath.hmain(){intx,y,z;for(x=0;x=100/5;x++)for(y=0;y=100/3;y++)for(z=0;z=100;z++){if(x+y+z==100&&15*x+9*y+z==300)printf(“x=%d,y=%d,z=%d\n”,x,y,z);}}程序代码3.3递推与迭代法概述递推是计算机数值计算中的一个重要算法。其基本策略是将复杂的运算划分为可以重复操作的若干个简单的运算,进而充分利用计算机擅长重复计算的特点。在C程序中,利用for语句实现迭代的过程,可以认为是递推的一种特例。采用递推法进行问题求解的关键在于找出递推公式和边界条件。递推与迭代法应用实例1:等比数列求和所谓等比数列是指在一组数据中,后项和前项之前存在着一个固定的比例关系。例如:整数序列3、15、75、375的初值是3,后项与前项是5倍的关系,即前项乘以5得到后项。本题要求给定等比序列的首项和比例,计算这个数列的前10项之和。例4:等比数列求和。问题分析等比数列的递推公式为:itemi=itemi-1*ratio后项等于前项乘以比例值sumi=sumi-1+itemi前i项之和等于前i-1项之和加当前项由于在重复上述递推计算之前,需要将第1项的值累加到sum中,所以,需要先将item存入sum中。算法描述NY开始输入item,ratioitemsum1ii10item*ratioitem加一sum+itemsumi加1结束输出sum#includestdio.hmain(){longitem,ratio,sum,i;printf(“\nEnterthefirstitemandratio:”);scanf(“%ld%ld”,&item,&ratio);sum=item;for(i=1;i10;i++){item*=ratio;sum+=item;}printf(“Sumof10itemsis%ld\n”,sum);}程序代码递推与迭代法应用实例2:求圆周率π圆周率π的计算公式为:π=4–4/3+4/5–4/7+4/9–4/11+…在程序中,圆周率π应该用单精度类型float或双精度类型double来表示。而且有一定的精度要求。例5:求圆周率π。问题分析圆周率π的计算公式为:π=4–4/3+4/5–4/7+4/9–4/11+…圆周率是通过将数列4、-4/3、4/5…求和得到的。在这个数列中,每个数据项的取值与前一项及该项的序号存在着一定的关系。1i24)1(X1ii可以通过迭代,逐个计算出每一个数据项,再将它们累加起来。为了满足要求的精度,可以通过检查数据项的大小来控制循环的终止。由于数据项的绝对值是递减的,且相邻项的符号不同,如果第n个数据项的绝对值已经小于精度值,则前n项之和一定已经满足精度要求了。算法描述NY开始0PI1iitem10-4(-1)i+14/(2i-1)itemPI+itemPIi加1结束输出PI#includestdio.h#includemath.hmain(){intsign=1;longi=1;doublePI=0.0,item;do{item=sign*4.0/(2*i++-1);sign=-sign;PI+=item;}while(fabs(item)1e-4);/*数据项精度控制循环*/printf(“PI=%lf\n”,PI);}程序代码递推与迭代法应用实例3:按位分解整数要求从键盘输入一个整数,然后将它的每一位分解成独立的数字字符并输出之。例6:按位分解整数。问题分析可以利用程序设计语言提供的整除和求余运算实现将整数分解的目的。例如,对于整数7326,用7326/1000就得到了最高位7,而7326%1000得到了其余的位数326。但是,这种方法要求首先获得整数最高位的权,因此,算法应该先求整数最高位的权,然后从高向低逐个分离出每位数字。算法描述NY开始输入x计算整数最高位权nn=1x//n的余数xn/10n结束打印x/n#includestdio.hmain(){longx,y,n;printf(“Enteraninteger:”);scanf(“%ld”,&x);y=x;n=1;while(y10){n*=10;y=y/10;}do{printf(“%ld\t”,x/n);x=x%n;n=n/10;}while(n=1);}程序代码
本文标题:C语言高级教程计算机算法初步
链接地址:https://www.777doc.com/doc-2909235 .html