算法设计与分析c语言描述课后答案
- 格式:doc
- 大小:258.50 KB
- 文档页数:8
C语言程序设计教程课后习题答案第一章C语言程序设计概述-习题答案1算法的描述有哪些基本方法?答1、自然语言2、专用工具2C语言程序的基本结构是怎样的?举一个例子说明。
答1、C语言程序由函数构成;2、“/*”与“*/”之间的内容构成C语言程序的注释部分;3、用预处理命令#include、#define可以包含有关文件或预定义信息;4、大小写字母在C语言中是有区别的;5、除main()函数和标准库函数外,用户也可以自己编写函数,应用程序一般由多个函数组成,这些函数指定实际所需要做的工作。
3C语言有什么特点?答1、具有结构语言的特点,程序之间很容易实现段的共享;2、主要结构成分为函数,函数可以在程序中被定义完成独立的任务,独立地编译代码,以实现程序的模块化;3、运算符丰富,包含的范围很广;4、数据类型丰富;5、允许直接访问物理地址,即可直接对硬件进行损伤,实现汇编语言的大部分功能;6、限制不太严格,程序设计自由度大,这样使C语言能够减少对程序员的束缚;7、生成的目标代码质量,程序执行效率高,同时C语言编写的程序的可移植性好。
4★指出合法与不合法的标识符命名。
答AB12--√ leed_3-- a*b2--× 8stu--× D.K.Jon--× EF3_3--√ PAS--√ if--×XYZ43K2--√ AVE#XY--× _762--√ #_DT5--× C.D--×5说明下列Turbo C热键的功能。
答F2:源文件存盘 F10:调用主菜单 F4:程序运行到光标所在行(用于调试程序)Ctrl+F9:编译并链接成可执行文件 Alt+F5:将窗口切换到 DOS 下,查看程序运行结果。
6说明下列Turbo C方式下输入并运行下列程序,记录下运行结果。
①main(){printf("********************\n");printf(" welcome you \n");printf(" very good \n);printf("********************\n");}②main(){ int a,b,c,t;printf("please input three numbers;");scanf("%d,%d,%d",&a,&b,&c); /*教材S是错误的*/t=max(max(a,b),c);printf("max number is:%d\n",t);}int max(int x, int y){ int z;if(x>y)z=x;else z=y;return(z);}答运行结果:********************welcome youvery good********************运行结果:please input three numbers;3,1,4 /*左侧下划线内容为键盘输入*/max number is:47一个C程序是由若干个函数构成的,其中有且只能有一个___函数。
《C语言程序设计》课后习题参考答案第1章C语言及程序设计概述1.单选题(1)A (2)B (3)A (4)B (5)C2.填空题(1)//,/*…*/(2)scanf()(3)printf()3.判断题(1)对(2)错(3)错(4)对第二章:数据类型运算符与表达式1.单选题(1)C (2)D (3)C (4)B (5)C (6)A (7)B (8)D (9)A(8)D(9)A(10)B(11)C(12)C(13)D(15)B(16)C(17)A(18)A(19)B(20)C(21)C(22)D(23)C(24)A(25)D(26)B(27)C(28)B(29)B(30)A2.填空题(1)sqrt(pow(y,x)+log10(y)) (2)36(3)6(4)3 3(6)36(7)int x=8,y=8;(8)1(9)E(10)6,7,8,9(11)6(12)66,96(13)240(14)1,1,-1,-1(15)5,2,6(16)1(17)!(18)2(19)(a>0&&a<101)&&(a%3==0||a%7==0) (20)A3.程序分析题(1)2 72 74 94 412 12116(3)100 d 68 D97 a 49 1 (4)0 1 0 1 (5)2 4 6 7-0.58 7046.587.5(6)33 12 113 13 082 32(7)618 30181814.改错题(1)①无初始赋值,不能输出②数据精度丢失③少“;”号④单字符变量不能保存字符串常量⑤不能连续初始化⑥非法标识符(2)short i=38000溢出PI=3.1416 常量不能修改值Printf(“%d”,x%y) %必须是整数a*=(b+c)/=d符合赋值左边不能是表达式第三章:算法概念与顺序结构程序设计1.选择题(1)D(2)B、D(3)D(4)B(5)C(6)A(8)C(9)B(10)D2.填空题.(1)一条语句;(2)小于左右(3)%%(4)输出项列表输出控制符(5)取地址取a的地址(6)从盘获取一个字符(7)大括号(8)f=68.00(9)n1=%d\n n2=%d(10)7,5,c=33.程序分析题.(1)i=100,c=a,f=1.234000(2)65535,65536(10)1234,123.5,12345.5第四章:选择结构程序设计(1)C (2)B (3)B (4)B (5)D (6)D (7)D (8)A (9)B (10)A (11)B (12)B (13)D (14)A (15)C (16)A (17)C (18)D (19)B (20)D (21)A(23)A(24)A2.填空题.(1)1(2)5 8 8(3)4 5 99(4)2(5)10 20 0(6)2 1(7)-4(8)3(9)No(10)25(11)45 45(12)0(13)5.5(14)13(15)3第五章:循环结构程序设计(1)C(2)A(3)D(4)B(5)D(6)B(7)A A或B(8)输出4444(9)B(10)A(11)B(12)C(13)A(14)B2.填空题.(1)r=m;m=n;n=rm%n(2)3(3)-5(4)i%3==2&&i%5==3&&i%7==2 j==5j!=k(6)int s=8,j=i+2k+i+j==8(7)8(8)k&&i<=500 k/10 continue第六章:数组1.选择题(1)B(2)C(3)D(4)D(5)B(6)C(7)B(8)A(9)A(10)D2.填空题.(1)按行序优先的原则(2)0 9(4)1 2(5)6(6)前者以回车后者以空格或回车作为间隔符(7)gets()(8)&a[i](9)char k -1(10)9 83.程序分析题.(1)1 3 7 15(2)0 0 0(3)读取输入字符串中数字字符(4)①if(str1==str2) (strcmp(str1,str2)==0)②&c1[0]③m[i][k-1]第七章:函数的调用1.选择题(1)B(2)C(3)C(4)A(6)D(7)D(8)D(9)B(10)D(11)A(12)A(13)B(14)B2.填空题.(1)有参无参(2)顺序类型(3)定义调用(4)①fmax(a,N) ②s[k]=s[p](5)①age(n-1)+2 ②age(5)(6)①prt(c,n-1) ②prt(…‟,n-i) ③prt(…*‟,2*i-1) 3.程序分析题.(1)h l o(2)3(3)2 6(4)5 25。
函数一、选择题1-5 ADCBD 6-10 DADAC11-15 DBDCC 16-17 DC二、填空题(1)3,2,2,3 (2)4,3,5 (3)t*10 (4)double max 从键盘上输入两个数据,输出最大值(5)m=fun(a,4)+fun(b,4)-fun(a+b,3) (6)a=1.0;b=1.0;s=1.0;(7)x x*x+1 (8)9 (10)-f指针一、选择题1-5 CADBC 6-10 CAACD 11-15 CACBD 16-20 ACCAA二、填空题(1)3 5 (2)5 3 (3)k *k (4)8 4 (5)0 7数组与指针一、选择题1-5 CBDCA 6-10 DCDAB 11-15 CADAD 16-20 BCBDD 21-25 ABBAC 26-30 DBDDB31-33 CCA二、填空题(1)1111 (2)24 (3)6 (4)19 (5)6 (6)5756 (7)2 4(8)1 2 3 (9)92 (10)580 5 60 0 9数组与函数一、选择题1-5 BADCA 6-10 BABCA 11-15 BACDA 16-17 BC二、填空题(1)s=18 (2)11 (3)br[i] (4)j<i a[i][j]=a[j][i] (5)x[i][i] x[i-1][j-1]+x[i-1][j](6)a[k][i] *sum x,&s (7)row a[row][colum] (8)j+1 i%2==1 (9)a[row][col]>max max<min字符串一、选择题1-5 CDAAC 6-10 ACBCB 11-15 DABDD 16-20 BCBDC 21-25 BDCBB 26-30 DAAAC31-35 CDDCA二、填空题(1)abcfg(2)efgh(3)*t(4)bcdefgha(5)gae(6)*2*4*6*8*(7)*t++(8)cdeab (9)s-1 *s++ (10)p+n(11)str+strlen(str)-1 t==0 huiwen(str) (12)s[i]>='0'&&s[i]<='9' (13)c=getchar() 1对C语言的深入讨论一、选择题1-5 CDCDB 6-10 DACDA 11-15 ADBDC 16-20 CAADA 21-25 CDDCB 26-28 DC 二、填空题(1)findbig (2)c(3)!knahT (4)3*sizeof(double) 1.50,2.50,3.75 (5)11110111 (6)/i结构体与共用体一、选择题1-5 DBDCB 6-10 CDBAD 11 (1)C (2)A (3)B 12-16 ACBDD二、填空题(1)struct node * (2)sizeof(struct node) (3)p!=NULL p->next (4)->next->data (5) 2002shangxian (6)struct DATE d={2006,10,1};文件一、选择题1-5 CDDBA 6-10 BCDCA 11-15 DBADA 16-17 DB二、填空题(1)"d1.dat","rb" (2)"a" (3)!feof(fp) (4)"wb""rb" (5)Hell (6)fopen ftell。
数据结构与算法分析:C语⾔描述(原书第2版简体中⽂版!!!)PDF+源代码+习题答案转⾃:/Linux/2014-04/99735.htm数据结构与算法分析:C语⾔描述(原书第2版中⽂版!!!) PDF+源代码+习题答案数据结构与算法分析:C语⾔描述(原书第2版)是《data structures and algorithm analysis in c》⼀书第2版的简体中译本。
原书曾被评为20世纪顶尖的30部计算机著作之⼀,作者mark allen weiss在数据结构和算法分析⽅⾯卓有建树,他的数据结构和算法分析的著作尤其畅销,并受到⼴泛好评.已被世界500余所⼤学⽤作教材。
在本书中,作者更加精炼并强化了他对算法和数据结构⽅⾯创新的处理⽅法。
通过c程序的实现,着重阐述了抽象数据类型的概念,并对算法的效率、性能和运⾏时间进⾏了分析。
数据结构与算法分析:C语⾔描述(原书第2版) PDF下载:百度⽹盘免费下载地址:(本⼈是从这⾥下载的,感谢原博主)全书特点如下: ●专⽤⼀章来讨论算法设计技巧,包括贪婪算法、分治算法、动态规划、随机化算法以及回溯算法 ●介绍了当前流⾏的论题和新的数据结构,如斐波那契堆、斜堆、⼆项队列、跳跃表和伸展树 ●安排⼀章专门讨论摊还分析,考查书中介绍的⼀些⾼级数据结构 ●新开辟⼀章讨论⾼级数据结构以及它们的实现,其中包括红⿊树、⾃顶向下伸展树。
treap树、k-d树、配对堆以及其他相关内容 ●合并了堆排序平均情况分析的⼀些新结果⽬录出版者的话专家指导委员会译者序前⾔第1章引论第2章算法分析第3章表、栈和队列第4章树第5章散列第6章优先队列(堆)第7章排序第8章不相交集ADT第9章图论算法第10章算法设计技巧第11章摊还分析第12章⾼级数据结构及其实现索引。
数据结构与算法分析c语言描述中文答案一、引言数据结构与算法是计算机科学中非常重要的基础知识,它们为解决实际问题提供了有效的工具和方法。
本文将以C语言描述中文的方式,介绍数据结构与算法分析的基本概念和原理。
二、数据结构1. 数组数组是在内存中连续存储相同类型的数据元素的集合。
在C语言中,可以通过定义数组类型、声明数组变量以及对数组进行操作来实现。
2. 链表链表是一种动态数据结构,它由一系列的节点组成,每个节点包含了数据和一个指向下一个节点的指针。
链表可以是单链表、双链表或循环链表等多种形式。
3. 栈栈是一种遵循“先进后出”(Last-In-First-Out,LIFO)原则的数据结构。
在C语言中,可以通过数组或链表实现栈,同时实现入栈和出栈操作。
4. 队列队列是一种遵循“先进先出”(First-In-First-Out,FIFO)原则的数据结构。
在C语言中,可以通过数组或链表实现队列,同时实现入队和出队操作。
5. 树树是一种非线性的数据结构,它由节点和边组成。
每个节点可以有多个子节点,其中一个节点被称为根节点。
在C语言中,可以通过定义结构体和指针的方式来实现树的表示和操作。
6. 图图是由顶点和边组成的数据结构,它可以用来表示各种实际问题,如社交网络、路网等。
在C语言中,可以通过邻接矩阵或邻接表的方式来表示图,并实现图的遍历和查找等操作。
三、算法分析1. 时间复杂度时间复杂度是用来衡量算法的执行时间随着问题规模增长的趋势。
常见的时间复杂度有O(1)、O(log n)、O(n)、O(n^2)等,其中O表示“量级”。
2. 空间复杂度空间复杂度是用来衡量算法的执行所需的额外内存空间随着问题规模增长的趋势。
常见的空间复杂度有O(1)、O(n)等。
3. 排序算法排序算法是对一组数据按照特定规则进行排序的算法。
常见的排序算法有冒泡排序、插入排序、选择排序、快速排序、归并排序等,它们的时间复杂度和空间复杂度各不相同。
Program算法设计与分析基础中文版答案习题1.15..证明等式gcd(m,n)=gcd(n,m mod n)对每一对正整数m,n都成立.Hint:根据除法的定义不难证明:●如果d整除u和v, 那么d一定能整除u±v;●如果d整除u,那么d也能够整除u的任何整数倍ku.对于任意一对正整数m,n,若d能整除m和n,那么d一定能整除n和r=m mod n=m-qn;显然,若d能整除n和r,也一定能整除m=r+qn和n。
数对(m,n)和(n,r)具有相同的公约数的有限非空集,其中也包括了最大公约数。
故gcd(m,n)=gcd(n,r)6.对于第一个数小于第二个数的一对数字,欧几里得算法将会如何处理?该算法在处理这种输入的过程中,上述情况最多会发生几次?Hint:对于任何形如0<=m<n的一对数字,Euclid算法在第一次叠代时交换m和n, 即gcd(m,n)=gcd(n,m)并且这种交换处理只发生一次.7.a.对于所有1≤m,n≤10的输入, Euclid算法最少要做几次除法?(1次)b. 对于所有1≤m,n≤10的输入, Euclid算法最多要做几次除法?(5次)gcd(5,8)习题1.21.(农夫过河)P—农夫W—狼G—山羊C—白菜2.(过桥问题)1,2,5,10---分别代表4个人, f—手电筒4. 对于任意实系数a,b,c, 某个算法能求方程ax^2+bx+c=0的实根,写出上述算法的伪代码(可以假设sqrt(x)是求平方根的函数)算法Quadratic(a,b,c)//求方程ax^2+bx+c=0的实根的算法//输入:实系数a,b,c//输出:实根或者无解信息If a≠0D←b*b-4*a*cIf D>0temp←2*ax1←(-b+sqrt(D))/tempx2←(-b-sqrt(D))/tempreturn x1,x2else if D=0 return –b/(2*a)else return “no real roots”else //a=0if b≠0 return –c/belse //a=b=0if c=0 return “no real numbers”else return “no real roots”5.描述将十进制整数表达为二进制整数的标准算法a.用文字描述b.用伪代码描述解答:a.将十进制整数转换为二进制整数的算法输入:一个正整数n输出:正整数n相应的二进制数第一步:用n除以2,余数赋给Ki(i=0,1,2...),商赋给n第二步:如果n=0,则到第三步,否则重复第一步第三步:将Ki按照i从高到低的顺序输出b.伪代码算法DectoBin(n)//将十进制整数n转换为二进制整数的算法//输入:正整数n//输出:该正整数相应的二进制数,该数存放于数组Bin[1...n]中i=1while n!=0 do {Bin[i]=n%2;n=(int)n/2;i++;}while i!=0 do{print Bin[i];i--;}9.考虑下面这个算法,它求的是数组中大小相差最小的两个元素的差.(算法略) 对这个算法做尽可能多的改进.算法MinDistance(A[0..n-1])//输入:数组A[0..n-1]//输出:the smallest distance d between two of its elements习题1.31.考虑这样一个排序算法,该算法对于待排序的数组中的每一个元素,计算比它小的元素个数,然后利用这个信息,将各个元素放到有序数组的相应位置上去.a.应用该算法对列表”60,35,81,98,14,47”排序b.该算法稳定吗?c.该算法在位吗?解:a. 该算法对列表”60,35,81,98,14,47”排序的过程如下所示:b.该算法不稳定.比如对列表”2,2*”排序c.该算法不在位.额外空间for S and Count[] 4.(古老的七桥问题)习题1.41.请分别描述一下应该如何实现下列对数组的操作,使得操作时间不依赖数组的长度. a.删除数组的第i 个元素(1<=i<=n)b.删除有序数组的第i 个元素(依然有序) hints:a. Replace the i th element with the last element and decrease the array size of 1b. Replace the ith element with a special symbol that cannot be a value of the array ’s element(e.g., 0 for an array of positive numbers ) to mark the i th position is empty. (“lazy deletion ”)第2章 习题2.17.对下列断言进行证明:(如果是错误的,请举例) a. 如果t(n )∈O(g(n),则g(n)∈Ω(t(n)) b.α>0时,Θ(αg(n))= Θ(g(n)) 解:a. 这个断言是正确的。
数据结构与算法分析c语言描述中文答案【篇一:数据结构(c语言版)课后习题答案完整版】选择题:ccbdca6.试分析下面各程序段的时间复杂度。
(1)o(1)(2)o(m*n)(3)o(n2)(4)o(log3n)(5)因为x++共执行了n-1+n-2+??+1= n(n-1)/2,所以执行时间为o(n2)(6)o(n)第2章线性表1.选择题babadbcabdcddac 2.算法设计题(6)设计一个算法,通过一趟遍历在单链表中确定值最大的结点。
elemtype max (linklist l ){if(l-next==null) return null;pmax=l-next; //假定第一个结点中数据具有最大值 p=l-next-next; while(p != null ){//如果下一个结点存在if(p-data pmax-data) pmax=p;p=p-next; }return pmax-data;(7)设计一个算法,通过遍历一趟,将链表中所有结点的链接方向逆转,仍利用原表的存储空间。
void inverse(linklist l) { // 逆置带头结点的单链表 l p=l-next; l-next=null; while ( p) {q=p-next; // q指向*p的后继p-next=l-next;l-next=p; // *p插入在头结点之后p = q; }}(10)已知长度为n的线性表a采用顺序存储结构,请写一时间复杂度为o(n)、空间复杂度为o(1)的算法,该算法删除线性表中所有值为item的数据元素。
[题目分析] 在顺序存储的线性表上删除元素,通常要涉及到一系列元素的移动(删第i个元素,第i+1至第n个元素要依次前移)。
本题要求删除线性表中所有值为item的数据元素,并未要求元素间的相对位置不变。
因此可以考虑设头尾两个指针(i=1,j=n),从两端向中间移动,凡遇到值item的数据元素时,直接将右端元素左移至值为item的数据元素位置。
第一章R 51-3.最大公约数为1。
快1414倍。
主要考虑循环次数,程序1-2的while 循环体做了 10次,程序1-3的while 循环体做了 14141次(14142-2 循环) 若考虑其他语句,则没有这么多,可能就 601倍。
第画线语句的执行次数为 T n 。
2-10. (1) 当F 1 2时,5n 8n2 5n 2 ,所以,可选c 5 , n 0 1 o 对于nn,f(n) 5n 28n 2 5n 2,所以,5n 2 8n 2(n 2)。
(2) 当F8时,L 2ccL25n 8n 2 5n2n 224n ,所以,可选c 4 ,n 0 8。
对于n n 0,f(n) 5n 28n 2 4n 22,所以,5n8n 2 (n 2)。
(3) 由(1 )、(: 2 )可 '知,取 G 4, c 2 5 ,n 。
8,当n n 0时,有2qn 5n 28n2qn' 「,所以5n28n 2 (n 2)。
2-11. (1) 当 n 3 时,log nlog 3n ,所以 f (n) 20n logn 21n , g(n)n log 3n 2n 。
可选 21一,n o 3。
对于 n 2 n o ,f(n) cg(n),即 f(n)(g (n ))。
注意:是f (n )和g (n )的关系。
(2) 2 2log n ,所以 f (n) n /log nn 2,g(n) n log 2 n n 2。
可选 c 1,n o 对于 n n o , f(n) 2n cg(n),即 f(n) (g(n))。
因为 f(n) (log n)lognjogdogn),g(门)门/ log n n log n 2。
当 F4 时,f(n) nlog(logn)2-8. (1)画线语句的执行次数为logn 。
(log n )。
划线语句的执行次数应该理解为一格整体。
(2)画线语句的执行次数为 n(n 1)(n 2)。
5..证明等式gcd(m,n)=gcd(n,m mod n)对每一对正整数m,n都成立.Hint:根据除法的定义不难证明:●如果d整除u和v, 那么d一定能整除u±v;●如果d整除u,那么d也能够整除u的任何整数倍ku.对于任意一对正整数m,n,若d能整除m和n,那么d一定能整除n和r=m mod n=m-qn;显然,若d能整除n和r,也一定能整除m=r+qn和n。
数对(m,n)和(n,r)具有相同的公约数的有限非空集,其中也包括了最大公约数。
故gcd(m,n)=gcd(n,r)6.对于第一个数小于第二个数的一对数字,欧几里得算法将会如何处理?该算法在处理这种输入的过程中,上述情况最多会发生几次?Hint:对于任何形如0<=m<n的一对数字,Euclid算法在第一次叠代时交换m和n, 即gcd(m,n)=gcd(n,m)并且这种交换处理只发生一次.7.a.对于所有1≤m,n≤10的输入, Euclid算法最少要做几次除法?(1次)b. 对于所有1≤m,n≤10的输入, Euclid算法最多要做几次除法?(5次)gcd(5,8)习题1.21.(农夫过河)P—农夫W—狼G—山羊C—白菜2.(过桥问题)1,2,5,10---分别代表4个人, f—手电筒4. 对于任意实系数a,b,c, 某个算法能求方程ax^2+bx+c=0的实根,写出上述算法的伪代码(可以假设sqrt(x)是求平方根的函数)算法Quadratic(a,b,c)//求方程ax^2+bx+c=0的实根的算法//输入:实系数a,b,c//输出:实根或者无解信息D←b*b-4*a*cIf D>0temp←2*ax1←(-b+sqrt(D))/tempx2←(-b-sqrt(D))/tempreturn x1,x2else if D=0 return –b/(2*a)else return “no real roots”else //a=0if b≠0 return –c/belse //a=b=0if c=0 return “no real numbers”else return “no real roots”5.描述将十进制整数表达为二进制整数的标准算法a.用文字描述b.用伪代码描述解答:a.将十进制整数转换为二进制整数的算法输入:一个正整数n输出:正整数n相应的二进制数第一步:用n除以2,余数赋给Ki(i=0,1,2...),商赋给n第二步:如果n=0,则到第三步,否则重复第一步第三步:将Ki按照i从高到低的顺序输出b.伪代码算法DectoBin(n)//将十进制整数n转换为二进制整数的算法//输入:正整数n//输出:该正整数相应的二进制数,该数存放于数组Bin[1...n]中i=1while n!=0 do {Bin[i]=n%2;n=(int)n/2;i++;}while i!=0 do{print Bin[i];i--;}9.考虑下面这个算法,它求的是数组中大小相差最小的两个元素的差.(算法略) 对这个算法做尽可能多的改进.算法MinDistance(A[0..n-1])//输入:数组A[0..n-1]//输出:the smallest distance d between two of its elements习题1.31.考虑这样一个排序算法,该算法对于待排序的数组中的每一个元素,计算比它小的元素个数,然后利用这个信息,将各个元素放到有序数组的相应位置上去.a.应用该算法对列表‖60,35,81,98,14,47‖排序b.该算法稳定吗?c.该算法在位吗?解:a. 该算法对列表‖60,35,81,98,14,47‖排序的过程如下所示:b.该算法不稳定.比如对列表‖2,2*‖排序c.该算法不在位.额外空间for S and Count[]4.(古老的七桥问题)习题1.41.请分别描述一下应该如何实现下列对数组的操作,使得操作时间不依赖数组的长度. a.删除数组的第i 个元素(1<=i<=n)b.删除有序数组的第i 个元素(依然有序) hints:a. Replace the i th element with the last element and decrease the array size of 1b. Replace the ith element with a special symbol that cannot be a value of the array ’s element(e.g., 0 for an array of positive numbers ) to mark the i th position is empty. (―lazy deletion ‖)第2章 习题2.17.对下列断言进行证明:(如果是错误的,请举例) a. 如果t(n )∈O(g(n),则g(n)∈Ω(t(n)) b.α>0时,Θ(αg(n))= Θ(g(n)) 解:a. 这个断言是正确的。
参考答案第1章一、选择题1. C2. A3. C4. C A D B5. B6. B7. D 8. B 9. B 10. B 11. D 12. B二、填空题1. 输入;输出;确定性;可行性;有穷性2. 程序;有穷性3. 算法复杂度4. 时间复杂度;空间复杂度5. 正确性;简明性;高效性;最优性6. 精确算法;启发式算法7. 复杂性尽可能低的算法;其中复杂性最低者8. 最好性态;最坏性态;平均性态9. 基本运算10. 原地工作三、简答题1. 高级程序设计语言的主要好处是:(l)高级语言更接近算法语言,易学、易掌握,一般工程技术人员只需要几周时间的培训就可以胜任程序员的工作;(2)高级语言为程序员提供了结构化程序设计的环境和工具,使得设计出来的程序可读性好,可维护性强,可靠性高;(3)高级语言不依赖于机器语言,与具体的计算机硬件关系不大,因而所写出来的程序可移植性好、重用率高;(4)把复杂琐碎的事务交给编译程序,所以自动化程度高,发用周期短,程序员可以集中集中时间和精力从事更重要的创造性劳动,提高程序质量。
2. 使用抽象数据类型带给算法设计的好处主要有:(1)算法顶层设计与底层实现分离,使得在进行顶层设计时不考虑它所用到的数据,运算表示和实现;反过来,在表示数据和实现底层运算时,只要定义清楚抽象数据类型而不必考虑在什么场合引用它。
这样做使算法设计的复杂性降低了,条理性增强了,既有助于迅速开发出程序原型,又使开发过程少出差错,程序可靠性高。
(2)算法设计与数据结构设计隔开,允许数据结构自由选择,从中比较,优化算法效率。
(3)数据模型和该模型上的运算统一在抽象数据类型中,反映它们之间内在的互相依赖和互相制约的关系,便于空间和时间耗费的折衷,灵活地满足用户要求。
(4)由于顶层设计和底层实现局部化,在设计中出现的差错也是局部的,因而容易查找也容易2 算法设计与分析纠正,在设计中常常要做的增、删、改也都是局部的,因而也都容易进行。
第3章栈和队列一、基础知识题3.1有五个数依次进栈:1,2,3,4,5。
在各种出栈的序列中,以3,4先出的序列有哪几个。
(3在4之前出栈)。
【解答】34215 ,34251,345213.2铁路进行列车调度时,常把站台设计成栈式结构,若进站的六辆列车顺序为:1,2,3,4,5,6,那么是否能够得到435612, 325641, 154623和135426的出站序列,如果不能,说明为什么不能;如果能,说明如何得到(即写出"进栈"或"出栈"的序列)。
【解答】输入序列为123456,不能得出435612和154623。
不能得到435612的理由是,输出序列最后两元素是12,前面4个元素(4356)得到后,栈中元素剩12,且2在栈顶,不可能让栈底元素1在栈顶元素2之前出栈。
不能得到154623的理由类似,当栈中元素只剩23,且3在栈顶,2不可能先于3出栈。
得到325641的过程如下:1 2 3顺序入栈,32出栈,得到部分输出序列32;然后45入栈,5出栈,部分输出序列变为325;接着6入栈并退栈,部分输出序列变为3256;最后41退栈,得最终结果325641。
得到135426的过程如下:1入栈并出栈,得到部分输出序列1;然后2和3入栈,3出栈,部分输出序列变为13;接着4和5入栈,5,4和2依次出栈,部分输出序列变为13542;最后6入栈并退栈,得最终结果135426。
3.3若用一个大小为6的数组来实现循环队列,且当前rear和front的值分别为0和3,当从队列中删除一个元素,再加入两个元素后,rear和front的值分别为多少?【解答】2和43.4设栈S和队列Q的初始状态为空,元素e1,e2,e3,e4,e5和e6依次通过栈S,一个元素出栈后即进队列Q,若6个元素出队的序列是e3,e5,e4,e6,e2,e1,则栈S的容量至少应该是多少?【解答】43.5循环队列的优点是什么,如何判断“空”和“满”。
算法与数据结构---C语言描述(第三版)第1章绪论1、解释以下概念:逻辑结构,存储结构,操作,数据结构,数据结构的表示,数据结构的实现,抽象数据类型,算法,算法的时间代价,算法的空间代价,大O表示法,贪心法,回溯法,分治法。
答:(1)逻辑结构(数学模型):①指数据元素之间地逻辑关系。
②具体解释:指数学模型(集合,表,树,和图)之间的关系。
③描述方式:B = <K,R>, K是节点的有穷集合,R是K上的一个关系。
(2)存储结构(物理结构):数据的逻辑结构在计算机存储器中的映射(或表示)。
(3) 操作(行为):指抽象数据类型关心的的各种行为在不同的存储结构上的具体算法(或程序)。
(4) 数据结构:①传统观念:数据结构是计算机中表示(存储)的、具有一定逻辑关系和行为特征的一组数据。
②根据面向对象的观点:数据结构是抽象数据类型的物理实现。
(5) 数据结构的表示:(6) 数据结构的实现:(7) 抽象数据类型:(8) 算法:是由有穷规则构成(为解决某一类问题)的运算序列。
-算法可以有若干输入(初始值或条件)。
-算法通常又有若干个输出(计算结果)。
-算法应该具有有穷性。
一个算法必须在执行了有穷步之后结束。
-算法应该具有确定性。
算法的每一步,必须有确切的定义。
-算法应该有可行性。
算法中国的每个动作,原则上都是能够有机器或人准确完成的。
(9) 算法的时间代价:(10) 算法的空间代价:(11) 大O表示法:-更关注算法复杂性的量级。
-若存在正常数c和n0,当问题的规模n>=c*f(n), 则说改算法的时间(或空间)代价为O(f(n))(12) 贪心法:当追求的目标是一个问题的最优解是,设法把整个问题的求解工作分成若干步来完成。
在其中的每一个阶段都选择都选择从局部来看是最优的方案,以期望通过各个阶段的局部最有选择达到整体的最优。
例如:着色问题:先用一种颜色尽可能多的节点上色,然后用另一种颜色在为着色节点中尽可能多的节点上色,如此反复直到所有节点都着色为止;(13) 回溯法有一些问题,需要通过彻底搜索所有的情况寻找一个满足某些预定条件的最优解。
C语言课后习题答案(最终)第0章习题1. 将下列十进制数分别转化为二进制数、八进制数和十六进制数:(1)128 (2)511 (3)1024 (4)65535 (5)1048575 答:(1)10000000、200、80 (2)111111111、777、1FF (3)10000000000、2000、400(4)1111111111111111、177777、FFFF (5)11111111111111111111、3777777、FFFFF2. 将下列二进制数转化为十进制数和十六进制数:(1)1100110101B (2)101101.1011B 答:(1)821、335 (2)45.6875、2D.B3. 写出下列数的原码、反码、补码:15、-20、-27/32 答:(1)00001111、00000000、00001111 (2)10010100、11101011、11101100 (3)1.1101100、1.0010011、1.00101004. 16位无符号定点整数的数值表示范围为多少?8位补码的表示范围是多少?16位补码的表示范围是多少?答:5.1968年Dijkstra提出结构化程序设计的思想的原因是什么?简要回答结构化程序设计的经典定义。
答:结构化程序设计概念的提出主要是源于程序结构的层次性与模块化使得构造出来的软件具有良好的可理解性和可维护性,随着软件规模的扩大与复杂性的提高,程序的可维护性成为程序设计者们关注的重要问题之一。
如果一个程序的代码块仅仅通过顺序、选择和循环这3种基本控制结构进行连接,并且每个代码块只有一个入口和一个出口,则称这个程序是结构化的。
6.C程序在内存中存储在哪儿?计算机的内存空间是如何分区的?分区存放不同类型的数据的目的是什么?答:0~65535、-128~127、-32768~32767C语言程序属于应用程序,程序代码本身存放在应用程序区,程序运行时处理的数据存计算机的内存空间主要分为3个区:系统程序区、应用程序区和数据区,其中数据区放在应用程序数据区。
C语言课后题编程答案所有章节的课后习题的选择题和填空题大家必须熟练掌握,编程题掌握到第九章即可。
希望大家通过课后的编程题熟悉典型的编程算法,掌握基本的编程思路,注意编程细节。
第3章3-17 编写程序,把560分钟换算成用小时和分钟表示,然后进行输出。
#include<stdio.h>main(){int h,m。
h=560/60。
m=560%60。
printf(“560分钟可转换成%d小时%d分钟”,h,m)。
}程序总结:(1)只要在程序中用到系统提供的库函数,必须把库函数所在的头文件用#include命令包含进来。
否则库函数的使用无效。
输入输出库函数的头文件是:stdio.h。
数学函数的头文件是:math.h。
字符处理函数的头文件是:ctype.h。
字符串处理函数的头文件是:string.h。
(2)注意C语言中的“/”和“%”两种运算符。
“/”的运算结果取决于两操作数的类型。
比如:1/2=0(与数学中不同,结果与操作数的类型一致,所以结果只取商值),1.0/2=0.5(除之前2要自动类型转换成 2.0,因为只有同类型的操作数才能进行除运算), 1/2.0=0.5, 1.0/2.0=0.5。
“%”的两个操作数都必须是整数。
(3)printf(“560分钟可转换成%d小时%d分钟”,h,m)。
printf第一个参数要尽量详细,这样可以提高输出结果的可读性,恰当好处的添加提示性信息,可以提高程序的质量。
(4)int h,m。
变量起名要有艺术性,尽量做到见名知意。
3-18 编写程序,输入两个整数,1500和350,求出它们的商和余数并进行输出。
#include<stdio.h>main(){int a,b,m,n。
printf(“请输入两个整数:\n”)。
scanf(“%d%d”,&a,&b)。
m=a/b。
n=a%b。
printf(“%d除以%d商%d余%d”,a,b,m,n)。
《数据结构与算法分析:C语⾔描述_原书第⼆版》CH2算法分析_课后习题_部分解答对于⼀个初学者来说,作者的Solutions Manual把太多的细节留给了读者,这⾥尽⾃⼰的努⼒给出部分习题的详解:不当之处,欢迎指正。
1、按增长率排列下列函数:N,√2,N1.5,N2,NlogN, NloglogN,N log2N,Nlog(N2),2/N,2N,2N/2,37,N2logN,N3。
指出哪些函数以相同的增长率增长。
答:排列如下2/N < 37 < √2 < N < NloglogN < NlogN < Nlog(N2) < Nlog2N < N1.5 < N2 < N2logN < N3 < 2N/2 < 2N。
其中,NlogN 与 Nlog(N2) 的增长率相同,均为O(NlogN)。
补充说明:a) 其中 Nlog2N 与 N1.5, N3与 2N/2⼤⼩关系的判定,可以连续使⽤洛必达法则(N->∞时,两个函数⽐值的极限,等于它们分别求导后⽐值的极限)。
当然,更简单的是两边直接求平⽅。
b) 同时注意⼀个常⽤法则:对任意常数k,log k N = O(N)。
这表明对数增长得⾮常缓慢。
习题3中我们会证明它的⼀个更严格的形式。
2、函数NlogN 与 N1+ε/√logN (ε>0) 哪个增长得更快? 分析:我们⾸先考虑的可能是利⽤洛必达法则,但是对于第⼆个函数其上下两部分皆含有变量,难以求导(当然也不是不⾏,就是⿇烦些,如果你愿意设y = N1+ε/√logN,然后对两边取对数的话)。
这⾥我们将利⽤反证法: 要证NlogN < N1+ε/√logN,即证 logN < Nε/√logN。
既然⽤反证法,那么我们假设 Nε/√logN < logN。
两边取对数有ε/√logN logN < loglogN。
数据结构与算法分析c语言描述中文答案【篇一:数据结构(c语言版)课后习题答案完整版】选择题:ccbdca6.试分析下面各程序段的时间复杂度。
(1)o(1)(2)o(m*n)(3)o(n2)(4)o(log3n)(5)因为x++共执行了n-1+n-2+??+1= n(n-1)/2,所以执行时间为o(n2)(6)o(n)第2章线性表1.选择题babadbcabdcddac 2.算法设计题(6)设计一个算法,通过一趟遍历在单链表中确定值最大的结点。
elemtype max (linklist l ){if(l-next==null) return null;pmax=l-next; //假定第一个结点中数据具有最大值 p=l-next-next; while(p != null ){//如果下一个结点存在if(p-data pmax-data) pmax=p;p=p-next; }return pmax-data;(7)设计一个算法,通过遍历一趟,将链表中所有结点的链接方向逆转,仍利用原表的存储空间。
void inverse(linklist l) { // 逆置带头结点的单链表 l p=l-next; l-next=null; while ( p) {q=p-next; // q指向*p的后继p-next=l-next;l-next=p; // *p插入在头结点之后p = q; }}(10)已知长度为n的线性表a采用顺序存储结构,请写一时间复杂度为o(n)、空间复杂度为o(1)的算法,该算法删除线性表中所有值为item的数据元素。
[题目分析] 在顺序存储的线性表上删除元素,通常要涉及到一系列元素的移动(删第i个元素,第i+1至第n个元素要依次前移)。
本题要求删除线性表中所有值为item的数据元素,并未要求元素间的相对位置不变。
因此可以考虑设头尾两个指针(i=1,j=n),从两端向中间移动,凡遇到值item的数据元素时,直接将右端元素左移至值为item的数据元素位置。
习题13.设计算法求数组中相差最小的两个元素(称为最接近数)的差。
要求分别给出伪代码和C++描述。
//采用分治法//对数组先进行快速排序//在依次比较相邻的差#include <iostream>using namespace std;int partions(int b[],int low,int high){int prvotkey=b[low];b[0]=b[low];while (low<high){while (low<high&&b[high]>=prvotkey)--high;b[low]=b[high];while (low<high&&b[low]<=prvotkey)++low;b[high]=b[low];}b[low]=b[0];return low;}void qsort(int l[],int low,int high){int prvotloc;if(low<high){prvotloc=partions(l,low,high); //将第一次排序的结果作为枢轴qsort(l,low,prvotloc-1); //递归调用排序由low 到prvotloc-1qsort(l,prvotloc+1,high); //递归调用排序由 prvotloc+1到 high}}void quicksort(int l[],int n){qsort(l,1,n); //第一个作为枢轴,从第一个排到第n个}int main(){int a[11]={0,2,32,43,23,45,36,57,14,27,39};int value=0;//将最小差的值赋值给valuefor (int b=1;b<11;b++)cout<<a[b]<<' ';cout<<endl;quicksort(a,11);for(int i=0;i!=9;++i){if( (a[i+1]-a[i])<=(a[i+2]-a[i+1]) )value=a[i+1]-a[i];elsevalue=a[i+2]-a[i+1];}cout<<value<<endl;return 0;}4.设数组a[n]中的元素均不相等,设计算法找出a[n]中一个既不是最大也不是最小的元素,并说明最坏情况下的比较次数。
P151-3. 最大公约数为1。
快1414倍。
主要考虑循环次数,程序1-2的while循环体做了10次,程序1-3的while循环体做了14141次(14142-2循环)若考虑其他语句,则没有这么多,可能就601倍。
第二章2-8.(1)画线语句的执行次数为。
划线语句的执行次数应该理解为一格整体。
(2)画线语句的执行次数为。
(3)画线语句的执行次数为。
(4)当n为奇数时画线语句的执行次数为,当n为偶数时画线语句的执行次数为。
2-10.(1)当时,,所以,可选,。
对于,,所以,。
(2)当时,,所以,可选,。
对于,,所以,。
(3)由(1)、(2)可知,取,,,当时,有,所以。
2-11. (1) 当时,,所以,。
可选,。
对于,,即。
注意:是f(n)和g(n)的关系。
(2)当时,,所以,。
可选,。
对于,,即。
(3)因为,。
当时,,。
所以,可选,,对于,,即。
第二章2-17. 证明:设,则。
当时,。
所以,。
第五章5-4. SolutionType DandC1(int left,int right){while(!Small(left,right)&&left<right){int m=Divide(left,right);if(x<P(m) right=m-1;else if(x>P[m]) left=m+1;else return S(P)}}5-7. template <class T>int SortableList<T>::BSearch(const T&x,int left,int right) const{if (left<=right){int m=(right+left)/3;if (x<l[m]) return BSearch(x,left,m-1);else if (x>l[m]) return BSearch(x,m+1,right);else return m;}return -1;}第五章9.426351701234567-10证明:因为该算法在成功搜索的情况下,关键字之间的比较次数至少为,至多为。
在不成功搜索的情况下,关键字之间的比较次数至少为,至多为。
所以,算法的最好、最坏情况的时间复杂度为。
假定查找表中任何一个元素的概率是相等的,为,那么,不成功搜索的平均时间复杂度为,成功搜索的平均时间复杂度为。
其中,是二叉判定树的内路径长度,是外路径长度,并且。
12.(1)证明:当或或时,程序显然正确。
当n=right-left+1>2时,程序执行下面的语句:int k=(right-left+1)/3;StoogeSort(left,right-k);StoogeSort(left+k,right);StoogeSort(left,right-k);①首次递归StoogeSort(left,right-k);时,序列的前2/3的子序列有序。
②当递归执行StoogeSort(left+k,right);时,使序列的后2/3的子序列有序,经过这两次递归排序,使原序列的后1/3的位置上是整个序列中较大的数,即序列后1/3的位置上数均大于前2/3的数,但此时,前2/3的序列并不一定是有序的。
③再次执行StoogeSort(left,right-k);使序列的前2/3有序。
经过三次递归,最终使序列有序。
所以,这一排序算法是正确的。
(2)最坏情况发生在序列按递减次序排列。
,,。
设,则。
冒泡排序最坏时间复杂度为,队排序最坏时间复杂度为,快速排序最坏时间复杂度为。
所以,该算法不如冒泡排序,堆排序,快速排序。
13. template <class T>select (T&x,int k){if(m>n) swap(m,n);if(m+n<k||k<=0) {cout<<"Out Of Bounds"; return false;} int *p=new temp[k];int mid,left=0,right=n-1,cnt=0,j=0,r=0;for(int i=0;i<m;i++){while(k>0){do{mid=(left+right)/2;if(a[mid]<b[i]) left=mid;else if(a[mid]>b[i]) right=mid;else {cnt=mid; break;}}while(left<right-1)if(a[left]<b[i]) cnt=left;else cnt=left-1;if(k>cnt){if(cnt>0){for(j=0;j<cnt;j++){temp[j]=a[r];r++;}left=cnt;k-=cnt;}else{temp[j]=b[i];left=0;k--;}}else{for(j=0;j<k;j++){temp[j]=a[r];r++;}left=cnt;k-=cnt;return temp[k-1];}}}}第六章1.由题可得:,所以,最优解为,最大收益为。
8.第六章6-9.普里姆算法。
因为图G是一个无向连通图。
所以n-1<=m<=n (n-1)/2;O(n)<=m<=O(n2);克鲁斯卡尔对边数较少的带权图有较高的效率,而,此图边数较多,接近完全图,故选用普里姆算法。
6-10.T仍是新图的最小代价生成树。
证明:假设T不是新图的最小代价生成树,T’是新图的最小代价生成树,那么cost(T’)<cost(T)。
有cost(T’)-c(n-1)<cost(t)-c(n-1),即在原图中存在一颗生成树,其代价小于T的代价,这与题设中T是原图的最小代价生成树矛盾。
所以假设不成立。
证毕。
第七章1. Bcost(1,0)=0;Bcost(2,1)=c(1,1)+Bcost=5Bcost(2,2)=c(1,2)+Bcost(1,0)=2Bcost(3,3)=min{c(2,3)+Bcost(2,2),c(1,3)+Bcost(2,1)}=min{6+2,3+5}=8 Bcost(3,4)=c(2,4)+Bcost(2,2)=5+2=7Bcost(3,5)=min{c(1,5)+Bcost(2,1),c(2,5)+Bcost(2,2)}=min{3+5,8+2}=8Bcost(4,6)=min{c(3,6)+Bcost(3,3),c(4,6)+Bcost(3,4),c(5,6)+Bcost(3,5)}=min{1+8,6+7,6+8}=9 Bcost(4,7)=min{c(3,7)+Bcost(3,3),c(4,7)+Bcost(3,4),c(5,7)+Bcost(3,5)}=min{4+8,2+7,6+8}=9 Bcost(5,8)=min{c(6,8)+Bcost(4,6),c(7,8)+Bcost(4,7)}=min{7+9,3+9}=122.向后递推的计算过程如上题所示 向前递推过程如下: cost(5,8)=0cost(4,6)=7,cost(4,7)=3cost(3,3)=min{1+cost(4,6),4+cost(4,7)}=7, cost(3,4)=min{6+cost(4,6),2+cost(4,7)}=5 cost(3,5)=min{6+cost(4,6),2+cost(4,7)}=5 cost(2,1)=min{3+cost(3,3),3+cost(3,5)}=8cost(2,2)=min{6+cost(3,3),8+cost(3,5),5+cost(3,4)}=10 cost(1,0)=min{5+cost(2,1),2+cost(2,2)}=12所以,d(4,6)=d(4,7)=8, d(3,3)=d(3,4)=d(3,5)=7, d(2,1)=5, d(2,2)=4, d(1,0)=2 从s 到t 的最短路径为 (0, d(1,0)=2, d(2,2)=4, d(3,4)=7, d(4,7)=8),路径长为12。
第七章9. char A[8]={‘0’,’x’,’z’,’y’,’z’,’z’,’y’,’x’ } B[8]={‘0’,’z’,’x’,’y’,’y’,’z’,’x’,’z’}⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡4433221043332110433221103332211022222110222111101111110000000000 ⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡2122212022211220121222101312221022211220131222103133312000000000(a) c[i][j] (b )s[i][j]所以,最长公共字串为 (x,y,z,z)。
第七章11. void LCS::CLCS ( int i , int j ) {if ( i = = 0 || j = = 0) return; if (c[i][j] = = c[i-1][j-1]+1) {CLCS ( i-1,j-1);Cout<<a[i]; }else if ( c[i-1][j]>=c[i][j-1]) CLCS (i-1,j); else CLCS (i,j-1); }12. int LCS::LCSLength() {for ( int i =1; i<=m; i++) c[i][0]=0; for (i =1; i<=n; i++) c[0][i]=0; for (i =1; i<=m; i++)for (int j =1; j<=n; j++)if (x[i]= =y[j]) c[i][j]=c[i-1][j-1]+1;else if (c[i-1][j]>=c[i][j-1]) c[i][j]=c[i-1][j]; else c[i][j]=c[i][j-1]; return c[m][n]; } 15. )}0,0{(1=-S, )}2,10{(01=S ,)}2,10(),0,0{(0=S , )}7,25(),5,15{(11=S ,)}7,25(),5,15(),2,10(),0,0{(1=S , )}15,31(),13,21(),10,16(),8,6{(21=S ,)}15,31(),13,21(),10,16(),8,6(),0,0{(2=S )}16,40(),14,30(),11,25(),9,15(),1,9{(31=S , )}15,31(),14,30(),13,21(),10,16(),9,15(),8,6(),0,0{(3=S8-1.状态空间:描述问题的各种可能的情况,一种情况对呀状态空间的一个状态。