21算法的概念22简单算法举例23算法的特性24怎样表示

合集下载

《C语言程序设计》课后习题答案(第四版)

《C语言程序设计》课后习题答案(第四版)

第1章程序设计和C语言11.1什么是计算机程序11.2什么是计算机语言11.3C语言的发展及其特点31.4最简单的C语言程序51.4.1最简单的C语言程序举例61.4.2C语言程序的结构101.5运行C程序的步骤与方法121.6程序设计的任务141-5 #include <stdio.h>int main ( ){ printf ("**************************\n\n");printf(" Very Good!\n\n");printf ("**************************\n");return 0;}1-6#include <stdio.h>int main(){int a,b,c,max;printf("please input a,b,c:\n");scanf("%d,%d,%d",&a,&b,&c);max=a;if (max<b)max=b;if (max<c)max=c;printf("The largest number is %d\n",max); return 0;}第2章算法——程序的灵魂162.1什么是算法162.2简单的算法举例172.3算法的特性212.4怎样表示一个算法222.4.1用自然语言表示算法222.4.2用流程图表示算法222.4.3三种基本结构和改进的流程图262.4.4用N S流程图表示算法282.4.5用伪代码表示算法312.4.6用计算机语言表示算法322.5结构化程序设计方法34习题36第章最简单的C程序设计——顺序程序设计37 3.1顺序程序设计举例373.2数据的表现形式及其运算393.2.1常量和变量393.2.2数据类型423.2.3整型数据443.2.4字符型数据473.2.5浮点型数据493.2.6怎样确定常量的类型513.2.7运算符和表达式523.3C语句573.3.1C语句的作用和分类573.3.2最基本的语句——赋值语句593.4数据的输入输出653.4.1输入输出举例653.4.2有关数据输入输出的概念673.4.3用printf函数输出数据683.4.4用scanf函数输入数据753.4.5字符数据的输入输出78习题823-1 #include <stdio.h>#include <math.h>int main(){float p,r,n;r=0.1;n=10;p=pow(1+r,n);printf("p=%f\n",p);return 0;}3-2-1#include <stdio.h>#include <math.h>int main(){float r5,r3,r2,r1,r0,p,p1,p2,p3,p4,p5;p=1000;r5=0.0585;r3=0.054;r2=0.0468;r1=0.0414;r0=0.0072;p1=p*((1+r5)*5); // 一次存5年期p2=p*(1+2*r2)*(1+3*r3); // 先存2年期,到期后将本息再存3年期p3=p*(1+3*r3)*(1+2*r2); // 先存3年期,到期后将本息再存2年期p4=p*pow(1+r1,5); // 存1年期,到期后将本息存再存1年期,连续存5次p5=p*pow(1+r0/4,4*5); // 存活期存款。

c语言程序设计教程第二版课后习题答案

c语言程序设计教程第二版课后习题答案

c语言程序设计教程第二版课后习题答案【篇一:c语言程序设计教程_李含光_郑关胜_清华大学出版社习题答案习题答案[完美打印版]】1.单项选择题(1)a (2)c(3)d (4)c (5)b 2.填空题(1)函数(2)主函数(main)(3)printf() , scanf()第2章习题参考答案1.单项选择题1-5 cbccc 6-10 cdcdc 11-13 dbb 2.填空题(1)1(2)26 (3)6 , 4 , 2 (4)10 , 6(5)3.000000 (6)双精度(double)(7)9 (8)字母,数字,下划线(9)13.700000 (10)11(11)((m/10)%10)*100+(m/100)*10+m%10(12)0 (13)10 ,9 ,11(15)(x0y0)||(x0z0)||(y0||z0)(16)double (17)x==0(18)sqrt(fabs(a-b))/(3*(a+b))(19)sqrt((x*x+y*y)/(a+b))第3章习题参考答案1.单项选择题1-5 cccdd 6-10 bcdbc11-15 bcbbb16 a 2.填空题(1)用;表示结束(2){ }(3)y=x0?1:x==0?0:-1(4)y%4==0y%100!=0||y%400==0(5)上面未配对(6)default 标号(7)while , do while , for(8)do while(9)本次(10)本层 3.阅读程序,指出结果(1)yes(2)*(3)abother(4)28 70(5)2,0(6)8(7)36 (8)1(9)3,1,-1,3,1,-1(10)a=12 ,y=12(11)i=6,k=4 (12)1,-2 4.程序填空(1)x:y , u:z(2)m=n , m!=0,m=m/10(3)teps , t*n/(2*n+1) , printf(“%lf\n”,2*s) (4)m%5==0 ,printf(“%d\n”,k) (5)cx=getchar() , cx!=front , cx(6)double s=0, 1.0/k , %lf (7)s=0 , sgmin, 5.编程题(1). #include stdio.h int main() {double x,y; scanf(%lf,x); if(x1) y=x;else if(x=1.0x10) y=2*x-11; elsey=3*x-11;printf(%lf\n,y); return 0; } (2).#include stdio.h int main() {double x,y,z,min;scanf(%lf%lf%lf,x,y,z); if(xy) min=y; else min=x; if(minz)min=z;printf(min=%lf\n,min); return 0; } (3).#include stdio.h int main() {int y,m,d,flag,s=0,w,i;scanf(%d%d%d,y,m,d);flag=(y%4==0y%100!=0||y%400==0);w=((y-1)*365+(y-1)/4-(y-1)/100+(y-1)/400)%7;for(i=1;i=m;i++) {switch(i) {case 1:s=d;break; case 2:s=31+d;break; case 3:s=59+d;break; case 4:s=90+d;break; case 5:s=120+d;break; case6:s=151+d;break; case 7:s=181+d;break; case8:s=212+d;break; case 9:s=243+d;break; case10:s=273+d;break; case 11:s=304+d;break; case12:s=334+d;break;} }s=(w+s)%7; if(s==0)printf(星期日\n); elseprintf(星期%d\n,s); return 0; }(4).#include stdio.h int main() {float p,r;scanf(%f,p); if(p=10) r=p*0.1;else if(p10p=20) r=10*0.1+(p-10)*0.075; else if(p20p=40)r=10*0.1+10*0.075+(p-20)*0.05; else if(p40p=60)r=10*0.1+10*0.075+20*0.05+(p-40)*0.03;else if(p60p=100)r=10*0.1+10*0.075+20*0.05+20*0.03+(p-60)*0.015; else if(p100)r=10*0.1+10*0.075+20*0.05+20*0.03+40*0.015+(p-100)*0.01; printf(%f\n,r); return 0; } (5).#include stdio.h int main() {char c;while((c=getchar())!=\n) {if(c=ac=z) c=c-32; putchar(c);}return 0; } (6).#includestdio.h int main() {int m,k=2;printf(输入一个正整数:\n); scanf(%d,m); while(km) if(m%k==0) {printf(%4d,k); m=m/k; } else k++;printf(%4d\n,m); return 0; } (7).#includestdio.h int main() {int a,n,s=0,p=0,i;scanf(%d %d,n,a); for(i=1;i=n;i++) {p=p*10+a; s=s+p; }printf(%d\n,s); return 0; } (8).#includestdio.h int main(){int i,j,k;for(i=1;i=9;i++) for(j=0;j=9;j++) for(k=0;k=9;k++)printf(%5d,100*i+10*j+k); return 0; }(9).#includestdio.h #includemath.h int main() {float a=-10,b=10,x,f1,f2,f; f1=(((2*a-4)*a+3)*a)-6; f2=(((2*b-4)*b+3)*b)-6; do {x=(a+b)/2;f=(((2*x-4)*x+3)*x)-6; if(f*f10) { b=x; f2=f; } else { a=x;f1=f; }}while(fabs(f)=1e-6); printf(%6.2f\n,x); return 0; }(10).#includestdio.h#includemath.h int main() {int n=2;double eps,t,s=0,x;scanf(%lf %lf,x,eps); t=x; s=t;while(fabs(t)=eps) {t=-t*(2*n-3)*x*x/(2*n-2); s=s+t/(2*n); n++; }printf(%d,%lf\n,n,s); return 0; }(11).#includestdio.h int main() {unsigned long s,t=0,p=1; scanf(%u,s); while(s!=0) {if((s%10)%2!=0) {t=t+(s%10)*p; p=p*10; }s=s/10; }printf(%u\n,t); return 0; }第4章习题参考答案1.单项选择题1-5 dddbd 6-10 badcd 11-14 bdab 2.填空题(1)2(2)嵌套,递归(3)全局变量,局部变量,静态变量,动态变量(4)auto , static , register , extern (5)外部变量(6)编译,运行 3.阅读程序,指出结果(1)15(2)5(3)5,4,3 (4)i=5 i=2 i=2 i=4 i=2(5)求水仙花数(6)-5*5*5(7)30 (8)0 10 1 11 2 124.程序填空(1)float fun(float , float) , x+y,x-y, z+y,z-y (2)x , x*x+1 (3)s=0 , a=a+b 5.编程题(1).while(s!=0) #includestdio.h { unsigned int fun(unsigned int);p=p+s%10; int main() s=s/10; { } unsigned int s; return p; scanf(%u,s); } printf(%u\n,fun(s)); (2). return 0;#includestdio.h } #includestdlib.h unsigned int fun(unsignedint s) #includemath.h { void f1(float,float,float,float); unsigned int p=0; void f2(float,float,float,float);【篇二:《c语言程序设计》课后习题答案(第四版)谭浩强】t>1.1什么是计算机程序11.2什么是计算机语言11.3c语言的发展及其特点31.4最简单的c语言程序51.4.1最简单的c语言程序举例61.4.2c语言程序的结构101.5运行c程序的步骤与方法121.6程序设计的任务141-5 #include stdio.hint main ( ){ printf (**************************\n\n);printf( very good!\n\n);printf (**************************\n);return 0;}1-6#include stdio.hint main(){int a,b,c,max;printf(please input a,b,c:\n);scanf(%d,%d,%d,a,b,c);max=a;if (maxb)max=b;if (maxc)max=c;printf(the largest number is %d\n,max);return 0;}第2章算法——程序的灵魂162.1什么是算法162.2简单的算法举例172.3算法的特性212.4怎样表示一个算法222.4.1用自然语言表示算法222.4.2用流程图表示算法222.4.3三种基本结构和改进的流程图262.4.4用n?s流程图表示算法282.4.5用伪代码表示算法312.4.6用计算机语言表示算法322.5结构化程序设计方法34习题36第章最简单的c程序设计——顺序程序设计37 3.1顺序程序设计举例373.2数据的表现形式及其运算393.2.1常量和变量393.2.2数据类型423.2.3整型数据443.2.4字符型数据473.2.5浮点型数据493.2.6怎样确定常量的类型513.2.7运算符和表达式523.3c语句573.3.1c语句的作用和分类573.3.2最基本的语句——赋值语句593.4数据的输入输出653.4.1输入输出举例653.4.2有关数据输入输出的概念673.4.3用printf函数输出数据683.4.4用scanf函数输入数据753.4.5字符数据的输入输出78习题823-1 #include stdio.h#include math.hint main(){float p,r,n;r=0.1;n=10;p=pow(1+r,n);printf(p=%f\n,p);return 0;}3-2-1#include stdio.h#include math.hint main(){float r5,r3,r2,r1,r0,p,p1,p2,p3,p4,p5;p=1000;r5=0.0585;r3=0.054;r2=0.0468;r1=0.0414;r0=0.0072;p1=p*((1+r5)*5);// 一次存5年期p2=p*(1+2*r2)*(1+3*r3); // 先存2年期,到期后将本息再存3年期 p3=p*(1+3*r3)*(1+2*r2); // 先存3年期,到期后将本息再存2年期p4=p*pow(1+r1,5); // 存1年期,到期后将本息存再存1年期,连续存5次 p5=p*pow(1+r0/4,4*5); // 存活期存款。

关于21点的算法描述

关于21点的算法描述

关于21点的算法描述我们来设计一个21点的游戏最佳行动方法的计算算法。

21点的游戏规则:1.使用一套13*4=52张的扑克牌,不使用大小Joker2.每一局的开始首先轮流发给双方各两张牌。

双方获得的第一张牌是对对手透明的,其他牌均不会被对手知道。

3.各牌代表的分数如下:2=2分,3=3分,4=4分,5=5分,6=6分,7=7分,8=8分,9=9分,10=10分,J=10分,Q=10分,K=10分;A=1分或11分,记分时以对持牌者有利为准。

不分花色。

玩家拥有的点数计算方法为将持有的牌的分数累加。

4.游戏分庄家和非庄家。

5.满足下列获胜条件之一即获胜,游戏即重新开局:a.开局得到两张牌的点数为21点,且为庄家;b.开局得到两张牌的点数为21点,且为非庄家,庄家开局得到的牌的点数不足21点。

c.开局后持有5张牌且拥有点数不超过21点。

d.开局后持有牌的点数为21点e.开局后对手拥有的点数超过了21点f.开牌后自己的点数大于对手的点数g.自己为庄家,开牌后拥有点数与对手相同6.游戏流程:开局发牌,每人两张。

持续给非庄家发牌,直到非庄家要求停止,最多发牌3张,最少发牌0张。

持续给庄家发牌,直到庄家要求停止,最多发牌3张,最少发牌0张。

双方开牌。

最佳算法的假设:1.开局前所有已经发过了的牌都是已知的。

2.还没有发的牌的存放顺序是随机的。

算法的描述:本算法用来判断玩家应该继续要求发牌还是停止发牌以获得最大的获胜概率。

具体细节如下:设还没有发的牌以及对手手中不透明的牌的集合为A;已经拥有的牌的集合为B;情况1:玩家为庄家。

对手手中有N张牌。

N不小于2。

计算A的排序可能性,有如果对手手中有n张牌,并且A集合有M张牌,则A集合应该有f=(M,n)种可能。

初始化:将A集合的牌排序。

并保证新的A序列在之前没有出现过。

如果已经排序过f=(M,n)次,则跳转最终判断段。

发牌给对手:给对手发满N张牌,计算对手分数,如果大于等于21分,则重新初始化A。

算法的基本概念

算法的基本概念

时间 11 天零 13 小时 6.7 秒
第一个算法 第二个算法
n = 2
20
100 万次 714 次
1s
10000
3
714μs ( 10000 / 5 + 1 ) ´ ( 10000 / 3 + 1 ) 合并排序需 20 秒
选择排序需 6.4 天
算法的执行时间随问题规模的增大而增长的情况。 二、算法运行时间的评估 不能准确地计算算法的具体执行时间 不需对算法的执行时间作出准确地统计(除非在实时系统中) 1、计算模型:RAM 模型(随机存取机模型)、图灵机模型等 2、初等操作:所有操作数都具有相同的固定字长;所有操作的时间花费都是一个常数 时间间隔。算术运算;比较和逻辑运算;赋值运算,等等; 例:输入规模为 n ,百鸡问题的第一个算法的时间花费,可估计如下:
11. min = cost; 12. } 13. i++; 14. } 15. }
执行时间: while 循环执行 n ! 次。
表 1.1 算法 1.4 的执行时间随 n 的增长而增长的情况
n
5 6
n !
120μs 720μs
n
(1.1.10)
当 n 很大时, c 1 / c 2 的作用很小。 3、算法时间复杂性的定义: 定义 1.2 设算法的执行时间 T ( n ) ,如果存在 T * ( n ) ,使得:
lim
n ® ¥
T ( n ) - T * ( n ) = 0 T ( n )
1.2 算法的时间复杂性
一、算法复杂性的度量? 二、如何分析和计算算法的复杂性?
1.2.1 算法的输入规模和运行时间的阶

算法基本知识点总结

算法基本知识点总结

算法基本知识点总结一、算法的基本概念1. 算法的定义算法是用来解决特定问题的有限步骤的有序集合。

算法是一种计算方法,可以描述为一系列清晰的步骤,用来解决特定问题或执行特定任务。

2. 算法的特性(1)有穷性:算法必须在有限的步骤内结束。

(2)确定性:对于相同输入,算法应该产生相同的输出。

(3)可行性:算法必须可行,即算法中的每一步都可以通过已知的计算机能力来执行。

3. 算法的设计目标(1)正确性:算法应该能够解决给定的问题。

(2)可读性:算法应该易于理解和解释。

(3)高效性:算法应该能在合理的时间内完成任务。

二、算法的复杂度分析1. 时间复杂度算法的时间复杂度表示算法执行所需的时间长度,通常用“大O记法”表示。

时间复杂度反映了算法的运行时间与输入规模之间的关系。

常见的时间复杂度包括:(1)O(1):常数时间复杂度,表示算法的运行时间与输入规模无关。

(2)O(logn):对数时间复杂度,表示算法的运行时间与输入规模的对数成正比。

(3)O(n):线性时间复杂度,表示算法的运行时间与输入规模成正比。

(4)O(nlogn):线性对数时间复杂度,表示算法的运行时间与输入规模和对数成正比。

(5)O(n^2):平方时间复杂度,表示算法的运行时间与输入规模的平方成正比。

(6)O(2^n):指数时间复杂度,表示算法的运行时间与输入规模的指数成正比。

2. 空间复杂度算法的空间复杂度表示算法执行所需的内存空间大小。

常见的空间复杂度包括:(1)O(1):常数空间复杂度,表示算法的内存空间与输入规模无关。

(2)O(n):线性空间复杂度,表示算法的内存空间与输入规模成正比。

三、常见的算法设计思想1. 贪心算法贪心算法是一种选取当前最优解来解决问题的算法。

贪心算法的核心思想是从问题的某一初始解出发,通过一系列的局部最优选择,找到全局最优解。

2. 动态规划动态规划是一种将原问题分解成子问题来求解的方法。

动态规划通常适用于具有重叠子问题和最优子结构性质的问题。

简述算法的定义及算法设计的基本要求

简述算法的定义及算法设计的基本要求

简述算法的定义及算法设计的基本要求算法的定义及算法设计的基本要求是计算机科学中非常重要的概念,它们对于解决问题和优化计算过程至关重要。

本文将分别对算法的定义和算法设计的基本要求进行简述。

1.算法的定义算法是指用于解决特定问题的一系列清晰而有序的操作步骤,旨在获得问题的解决方案或结果。

算法可以用来执行各种计算任务,例如排序、搜索、加密和解密等。

算法是计算机科学的基础,它可以被看作是一种精确、详细的计算描述,形式上定义了一种计算过程。

算法的定义必须满足以下要求:(1)有限性:算法必须在有限的步骤内结束,不会无限循环或永远不停止。

(2)明确性:算法中的每个步骤必须清晰明确,不会存在歧义或二义性,以免导致不确定结果。

(3)输入:算法需要输入特定的数据或信息,可以是来自外部的输入或先前的计算结果。

(4)输出:算法应该产生一个明确的输出结果,与问题的需求一致,能够解决或回答特定问题。

(5)可行性:算法中的每个步骤必须可行,可以通过计算机或其他可执行计算的设备来实现。

2.算法设计的基本要求算法设计是创建有效和高效算法的过程,以解决特定问题。

在设计算法时,需要满足以下基本要求:(1)正确性:算法必须能够得出正确的结果,解决特定的问题。

要确保算法正确,可以采用数学证明、数学归纳法或测试验证等方法。

(2)可读性:算法应该易于理解和解释,便于其他程序员或研究人员使用和修改。

良好的可读性有助于减少错误和提高协作效率。

(3)健壮性:算法应该能够应对各种异常情况和错误输入,能够恰当处理错误,并返回有意义的错误信息。

健壮的算法能够提高程序的稳定性和可靠性。

(4)高效性:算法应该能够在合理的时间内解决问题,尽量减少时间和空间复杂度。

高效的算法有助于提高计算速度和资源利用率。

(5)可移植性:算法应该能够在不同的计算设备和环境中运行,无论是不同的操作系统、编程语言还是硬件平台。

可移植的算法可以提高软件的可重用性和可扩展性。

为了满足以上要求,通常可以采用以下方法来设计算法:(1)选择合适的数据结构:根据问题的特点和需求,选择合适的数据结构可以提高算法的效率。

八年级信息技术第四章第二节算法教学知识点总结

八年级信息技术第四章第二节算法教学知识点总结

八年级信息技术第四章第二节算法教学知识点总结信息技术八年级第四章第二节主要学习算法的教学知识点,具体总结如下:1. 算法的概念:算法是解决问题的一系列步骤的描述,它是一个能够解决特定问题的有限而明确的指令集合。

2. 算法的特性:一个好的算法应该具有以下特性:- 有穷性:算法必须能够在执行有限的步骤后停止。

- 确定性:算法的每一步都必须具有确定的含义,不会存在二义性。

- 可行性:算法的每一步都必须是可行的,能够被真正地执行。

- 输入:算法必须有零个或多个输入。

- 输出:算法必须有一个或多个输出。

3. 算法的表示方法:- 自然语言:用自然语言描述算法的步骤和逻辑。

- 流程图:使用图形化的符号和线条表示算法的步骤和顺序。

- 伪代码:用类似编程语言的形式描述算法的步骤和逻辑,更接近实际编程过程。

4. 常见的算法基本结构:- 顺序结构:按照特定的顺序执行各个步骤。

- 条件结构:根据条件判断选择不同的路径执行。

- 循环结构:根据条件判断循环执行一段代码。

5. 常见的排序算法:- 冒泡排序:依次比较相邻的两个元素,如果顺序不对则交换位置,直至整个数组有序。

- 插入排序:将一个元素插入到已经有序的序列中的适当位置,重复此操作直到整个数组有序。

- 选择排序:每次从未排序的部分中选择最小(或最大)的元素放到已排序部分的末尾。

6. 算法的效率和优化:- 时间复杂度:用来衡量算法执行时间的快慢,通常用大O记号表示。

- 空间复杂度:用来衡量算法执行时所需的额外空间或内存,通常也用大O记号表示。

- 算法优化:通过改进算法的设计和实现,以减少算法的时间复杂度和空间复杂度,提高算法的效率。

总的来说,八年级信息技术第四章第二节主要学习算法的基本概念、特性,以及常见的排序算法和算法的效率和优化。

同时也学习了算法的表示方法,包括自然语言、流程图和伪代码等。

这些知识点对于理解和设计算法,以及提高算法的效率都非常重要。

1-N-S流程图学习

1-N-S流程图学习
S5:如果i≤5,返回重新执行步骤S3以及其后的S4和S5;否则,算法结束。
如果计算100!只需将S5:若i≤5改成i≤100即可。
如果该求1×3×5×7×9×11,算法也只需做很少的改动:
S1: 1→t
S2: 3→i
S3: t×i→t
S4: i+2→t
S5:若i≤11,返回S3,否则,结束。
该算法不仅正确,而且是计算机较好的算法,因为计算机是高速运算的自动机器,实现循环轻而易举。
S3:若y能被4整除,不能被100整除,则输出y“是闰年”,然后转到S6
S4:若y能被100整除,又能被400整除,输出y“是闰年”否则输出y“不是闰年”,然后转到S6
S5:输出y“不是闰年”。
S6:y+1→y
S7:当y≤2500时,返回S2继续执行,否则,结束。
【例2.4】求 。
算法可表示如下:
S1: sigh=1
算法可表示如下:
S1:输入n的值
S2: i=2
S3: n被i除,得余数r
S4:如果r=0,表示n能被i整除,则打印n“不是素数”,算法结束;否则执行S5
S5: i+1→i
S6:如果i≤n-1,返回S3;否则打印n“是素数”;然后算法结束。
改进:
S6:如果i≤ ,返回S3;否则打印n“是素数”;然后算法结束。
2.4.2
流程图表示算法,直观形象,易于理解。
【例2.6】将例2.1求5!的算用流程图表示。
【例2.7】将例2.2的算用流程图表示。
【例2.8】将例2.3判定闰年的算用流程图表示。
【例2.9】将例2.4求 的算用流程图表示。
一个流程图包括:
1.表示相应操作的框;
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
图2.3中菱形框的作用是对一个给定的条件进行判 断,根据给定的条件是否成立来决定如何执行其后 的哪一个操作。它有一个入口,两个出口。见图2.4。
连接点(小圆圈)是用于将画在不同地方的流程线连 接起来。如图2.5中有两个以①为标志的连接点,它 表示这两个点是互相连接在一起的, 实际上它们是同 一个点。用连接点,可以避免流程线的交叉或过长, 使流程图清晰。
计算机算法可分为两类:
数值算法: 数值运算的目的是求数值解,如求方根、 求定积分等。研究深入,算法成熟,“数学程序 库”。
非数值算法: 最常见的是用于事务管理领域,如排 序和检索(查找)。参考已有类似算法,重新设计。
2.2 简单算法举例
例2.1 求1×2×3×4×5,即5!。 解一:
步骤1: 先求1×2,得到结果2。 步骤2: 将步骤1得到的结果2再乘以3,得到结果6。 步骤3: 将6再乘以4,得24。 步骤4: 将24再乘以5,得120。 这样的算法虽然是正确的,但太繁琐。如果要求 1×2×…×1000,则要写999个步骤,显然是不可 取的。
2. 三种基本结构
1966年,Bohra和Jacopini提出了以下三种基本结构,作 为表示一个良好算法的基本单元。
(1) 顺序结构,如图2.14所示。
(2) 选择结构,或称分支结构,如图2.15所示。
注意,无论 p 条件是否成立,只能执行A框或B框之一, 不可能既执行A框又执行B框。
A或B两个框中可以有一个是空的 ,即不执行任何操作, 如图2.16所示。
在结构化程序设计方法推广之后,许多书刊已用 N-S结构化流程图代替这种传统的流程图。但是每 一个程序编制人员都应当熟练掌握传统流程图。
图2.11 图2.12
2.4.3 三种基本结构和改进的流程图
1. 传统流程图的弊端
传统的流程图用流程线指出各框的执行顺序,对流 程线的使用没有严格限制。因此,使用者可以不受 限制地使流程随意地转来转去,使流程图变得毫无 规律。这种情况如图2.13所示。
解一:顺序查找,从第1个元素到最后1个元素,逐个进 行比较,直至找到为止。共比较9次
解二:折半查找,算法步骤: step1 首先确定整个查找区间的中间位置,mid = ( left + right )/ 2; step2 用待查关键字值与中间位置的关键字值进行比较: 若相等,则查找成功;若大于,则在后半区域继续进行 二分查找;若小于,则在前半区域继续进行二分查找。 Step3 对确定的缩小区域再按二分公式,重复上述步骤; 最后 得到结果:要么,查找成功,要么,查找失败。
第2章 程序的灵魂——算法
2.1 算法的概念 2.2 简单算法举例 2.3 算法的特性 2.4 怎样表示一个算法 2.5 结构化程序设计方法 作业
一个程序应包括以下两方面内容:
(1) 对数据的描述。在程序中要指定数据的类型和 数据的组织形式,即数据结构(data structure)。
(2) 对操作的描述。即操作步骤, 也就是算法 (algorithm)。
②再两个野人过河,一个野人回来;
③两个牧师过河,一个野人和一个牧师回来;
④两个牧师过河,一个野人回来;
⑤两个野人过河,一个野人回来;
⑥两个野人过河。
算法是指为解决一个问题而采取的方法和步骤。算法并不 是问题的结果,而是解题的过程和策略。
又例:对有序表关键字序列{5,10,19,21,31,37, 42,48,50,52},查找k为50的记录。
5. 有效性
算法中的每一个步骤都应当能有效地执行,并得到确定的结 果。
2.4 怎样表示一个算法
常用的有自然语言、传统流程图、结构化流程图、 伪代码、PAD图等。
2.4.1 用自然语言表示算法
通俗易懂,但文字冗长, 容易出现“歧义性”。 自然语言表示的含义往往不太严格,要根据上下文 才能判断其正确含义。
由于计算机是高速进行运算的自动机器,实现循环 是轻而易举的,所有计算机高级语言中都有实现循 环的语句。因此,上述算法不仅是正确的,而且是 计算机能实现的较好的算法。
例2.2 有50个学生,要求将他们之中成绩在80分以 上者打印出来。用n表示学生学号,n1代表第一个 学生学号,ni代表第i个学生学号。用g代表学生成 绩,gi代表第i个学生成绩,算法可表示如下。
解:算法可以表示如下
S1:输入n的值
S2:2=>i (i作为除数)
S3:n被i除,得余数r
S4:如果r=0,表示n能被i整除,则打印n“不是素 数”,算法结束;否则执行S5
S5:i+1=>i
S6:如果i≤n-1,返回S3;否则打印 n “是素数”, 然后结束。
实际上n不必被2到(n-1)的整数除,只需被2到n/2 整除即可,甚至只需被2到 n 之间的整数除即可。
数据是操作的对象,操作的目的是对数据进行加工 处理,以得到期望的结果。作为程序设计人员,必 须认真考虑和设计数据结构和操作步骤(即算法)。 因此,Pascal之父沃思(Nikiklaus Wirth)提出一 个公式:
数据结构 + 算法 = 程序
实际上,一个程序除了以上两个主要要素之外,还应当采 用结构化程序设计方法进行程序设计,并且用某一种计算机 语言表示。因此,可以这样表示:
例2.5 对一个大于或等于3的正整数,判断它 是不是一个素数。
分析:所谓素数,是指除了1和该数本身之外,不能 被其他任何整数整除的数。例如,13是素数,因为 它不能被2,3,4,…,12整除。
判断一个数n(n≥3)是否素数的方法是很简单的:将 n作为被除数,将2到(n-1)各个整数轮流作为除数, 如果都不能被整除,则n为素数。
S1:1=>i
S2:如果gi≥80,则打印ni和gi,否则不打印
S3:i+1=>i
S4:如果i≤50,返回S2,继续执行;否则,算法 结束。
本例中,变量i作为下标,用它来控制序号(第几个 学生,第几个成绩)。当i超过50时,表示已对50个 学生的成绩处理完毕,算法结束。
例2.3 判定2000—2500年中的每一年是否闰 年,将结果输出。
上例共比较3次
对同一个问题,可以有不同的解题方法和步骤,即不同 算法。
如何判断一个算法(程序)的优劣?时空复杂 度(时间复杂度、空间复杂度)。
一般来说,希望采用简单的和运算步骤少的方 法。
如果一个算法对其每一个输入实例,都能输出 正确的结果并停止,则称它是正确的。
因此 ,为了有效地进行解题,不仅需要保证 算法正确,还要考虑算法的质量,选择合适的 算法。
1.有穷性
一个算法应包含有限的操作步骤,而不能是无限的。一个算 法必须保证执行有限步之后结束;
2.确定性 算法的每一步骤必须有确切的定义;
3.有零个或多个输入
所谓输入是指在执行算法时需要从外界取得必要的信息。一 个算法也可以没有输入。
4. 有一个或多个输出 算法的目的是为了求解,“解” 就是输出。没有输出的算法 是没有意义的。
图2.14
图2.15
ห้องสมุดไป่ตู้
图2.16
(3) 循环结构。有两类循环结构:
① 当型(While型)循环结构 见图2.17(a)。它的功能是先判断给定的条件p1,成立时, 再执行A框操作,执行完A后,再判断条件p1是否成立,如 果仍然成立,再执行A框,如此反复执行A框,直到某一次 p1条件不成立为止,此时不执行A框,而从b点脱离循环结 构。 ② 直到型(Until型)循环 见图2.17(b)。它的功能是先执行A框,然后判断给定的p2 条件是否成立,如果p2条件不成立,则再执行A,然后再对 p2条件作判断,如果p2条件仍然不成立,又执行A……如此 反复执行A,直到给定的p2条件成立为止,此时不再执行A, 从b点脱离本循环结构。
解二:利用循环算法。算法改写如下: S1: 使p=1 S2: 使i=2 S3: p×i=>p S4: i+1 => i S5: 若i ≤ 5,返回步骤S3;否则,算法结束。 S是step(步)的缩写。这是写算法的习惯用法。 思考:如果将S5步骤写成 S5: 若i<5,返回S3。
这样会有什么问题?会得到什么结果? 思考:如果题目改为求1×3×5×7×9×11
图 2.3
图 2.4
图 2.5
例2.6 将例2.1求5!的算法用流程图表示
流程图见图2.6。如果需要将最后结果打印出来,可 以在菱形框的下面再加一个输出框,见图2.7。
例2.7 将例2.2的算法用流程图表示。将50名学生 中成绩在80分以上者的学号和成绩打印出来,见图 2.8。在此算法中没有包括输入50个学生数据的部 分,如果包括这个输入数据的部分,流程图如图2.9 所示。
例2.4 求1-1/2+1/3-1/4+…+1/99-1/100。 算法可以表示如下: S1:1=>sign S2:1=>sum S3:2=>deno S4:(-1)×sign=>sign S5:sign×(1/deno)=>term S6:sum+term=>sum S7:deno+1=>deno S8:若deno≤100返回S4;否则算法结束。
2.1 算 法 的 概 念
问题一:有两个杯子A和B,分别放有酒精和纯净水,试着 将两个杯子中的液体进行互换。
问题二:有三个牧师和三个野人过河,只有一条能装下两 个人的船,在河的任何一方或者船上,如果野人的人数大于 牧师的人数,那么牧师就会有被吃掉的危险。请找出一种安 全的渡河方案。
①两个野人先过河,一个野人回来;
这种算法难以阅读,也难以修改,从而使算法的可 靠性和可维护性难以保证。如果我们写出的算法能 限制流程的无规律任意转向,阅读起来就很方便。
图2.13
为了解决这个问题,人们设想,规定出几种基本结 构,然后按一定规律将各个基本结构顺序排列起来 组成一个算法结构(如同用一些基本预制构件来搭成 房屋一样) 。
相关文档
最新文档