计算机常用算法与程序的设计案例教程复习题解答

合集下载

《算法与程序设计》复习题

《算法与程序设计》复习题

算法与程序设计一、选择题部分(100题)一章一节:了解计算机解决问题的过程1.用计算机解决问题时,首先应该确定程序“做什么?”,然后再确定程序“如何做?”请问“如何做?”是属于用计算机解决问题的哪一个步骤?()A、分析问题B、设计算法C、编写程序D、调试程序答案:B2.学校要举行运动会,请你设计一个能够对运动员分数自动排序的软件,如果要设计此软件,以下最好的方法和步骤是()。

A、分析问题,编写程序,设计算法,调试程序B、设计算法,编写程序,提出问题,调试程序C、提出问题,设计算法,编写程序,调试程序D、设计算法,提出问题,编写程序,调试程序答案:C3.下列步骤不属于软件开发过程的是()。

A、任务分析与系统设计B、软件的销售C、代码编写与测试D、软件测试与维护答案:B4.用计算机解决问题的步骤一般为()①编写程序②设计算法③分析问题④调试程序。

A.①②③④ B.③④①② C.②③①④ D.③②①④答案:D5.以下描述中最适合用计算机编程来处理的是()。

A、确定放学回家的路线B、计算某个同学期中考试各科成绩总分C、计算100以内的奇数平方和D、在因特网上查找自己喜欢的歌曲答案:C6.以下问题中最适合用计算机编程处理的是()。

A、制定本学期的学习计划B、计算正方形的周长C、创作一首歌曲D、求1000以内的所有素数答案:D7.由“上车—掏钱—投币”所描述的问题是()。

A、无人售票车投币过程B、乘公交车过程C、上车过程D、下车过程答案:A一章二节:算法和算法描述8.下面说法正确的是()。

A、算法+数据结构=程序B、算法就是程序C、数据结构就是程序D、算法包括数据结构答案:A9.算法描述可以有多种表达方法,下面哪些方法不可以描述“水仙花数问题”的算法()。

A.自然语言B.流程图C.伪代码D.机器语言答案:D10.下面关于算法的说法错误的是()。

A、算法必须有输出B、算法就是程序C、算法不一定有输入D、算法必须在有限步执行后能结束答案:B11.算法的三种基本控制结构是顺序结构、分支结构和()。

算法与程序设计试题带答案

算法与程序设计试题带答案

算法与程序设计试题带答案1. 以下是一道经典的算法题,请编写代码实现求最大公约数(GCD)的算法。

```pythondef gcd(a, b):if b == 0:return areturn gcd(b, a % b)# 测试print(gcd(15, 25)) # 输出 5print(gcd(54, 72)) # 输出 18```解析:这是一个使用递归实现的辗转相除法算法,也叫欧几里得算法。

当两个数 a 和 b 求最大公约数时,如果 b 等于 0,则 a 就是最大公约数;否则,将 b 作为新的 a,将 a 除以 b 的余数作为新的 b 进行递归计算。

2. 请编写代码实现一个链表的反转。

```pythonclass ListNode:def __init__(self, val=0, next=None):self.val = valself.next = nextdef reverse_linked_list(head):prev = Nonecurr = headwhile curr:next_node = curr.nextcurr.next = prevprev = currcurr = next_nodereturn prev# 测试node1 = ListNode(1)node2 = ListNode(2)node3 = ListNode(3)node1.next = node2node2.next = node3reversed_head = reverse_linked_list(node1)while reversed_head:print(reversed_head.val)reversed_head = reversed_head.next```解析:这是一个经典的链表反转算法。

使用 prev、curr、next_node 三个指针来实现,其中 prev 用于保存上一个节点,curr 用于保存当前节点,next_node 用于保存下一个节点。

《算法与程序设计》复习题

《算法与程序设计》复习题

算法与程序设计一、选择题部分(100题)一章一节:了解计算机解决问题的过程1.用计算机解决问题时,首先应该确定程序“做什么?”,然后再确定程序“如何做?”请问“如何做?”是属于用计算机解决问题的哪一个步骤?( )A、分析问题B、设计算法C、编写程序D、调试程序 答案:B2.学校要举行运动会,请你设计一个能够对运动员分数自动排序的软件,如果要设计此软件,以下最好的方法和步骤是( )。

A、分析问题,编写程序,设计算法,调试程序B、设计算法,编写程序,提出问题,调试程序C、提出问题,设计算法,编写程序,调试程序D、设计算法,提出问题,编写程序,调试程序答案:C3.下列步骤不属于软件开发过程的是( )。

A、任务分析与系统设计B、软件的销售C、代码编写与测试D、软件测试与维护答案:B4.用计算机解决问题的步骤一般为( )①编写程序 ②设计算法 ③分析问题 ④调试程序。

A.①②③④ B.③④①② C.②③①④ D.③②①④ 答案:D5.以下描述中最适合用计算机编程来处理的是 ( )。

A、 确定放学回家的路线B、 计算某个同学期中考试各科成绩总分C、 计算100以内的奇数平方和D、 在因特网上查找自己喜欢的歌曲答案:C6.以下问题中最适合用计算机编程处理的是( )。

A、制定本学期的学习计划B、计算正方形的周长C、创作一首歌曲D、求1000以内的所有素数答案:D7.由“上车—掏钱—投币”所描述的问题是( )。

A、无人售票车投币过程B、乘公交车过程C、上车过程D、下车过程 答案:A一章二节:算法和算法描述8.下面说法正确的是( )。

A、算法+数据结构=程序B、算法就是程序C、数据结构就是程序D、算法包括数据结构答案:A9.算法描述可以有多种表达方法,下面哪些方法不可以描述“水仙花数问题”的算法( )。

A.自然语言B.流程图C.伪代码D.机器语言答案:D10.下面关于算法的说法错误的是( )。

A、算法必须有输出B、算法就是程序C、算法不一定有输入D、算法必须在有限步执行后能结束答案:B11.算法的三种基本控制结构是顺序结构、分支结构和( )。

算法与程序实践习题解答2(数制转换)

算法与程序实践习题解答2(数制转换)
2)检查:在未找到合适的b时,是否输出0。
CS
(来源:2973,程序设计导引及在线实践(李文新)例3.2P101)
问题描述:
在skew binary表示中,第k位的值xk表示xk*(2k+1-1)。每个位上的可能数字是0或1,最后面一个非零位可以是2,例如, 10120(skew) = 1*(25-1) + 0*(24-1) + 1*(23-1) + 2*(22-1)+0*(21-1) = 31 + 0 + 7 + 6 + 0 = 44.前十个skew数是0、1、2、10、11、12、20、100、101以及102。
在把skew二进制数转换成十进制时,只需把每位按权值展开求和即可。
参考程序2:
#include <stdio.h>
#include <string.h>
#include <math.h>
int main()
{
char str[40]; //读入的每个skew二进制数
while(scanf("%s",str)!=EOF)
样例输入:
本题没有输入。
样例输出:
2992
2993
2994
2995
2996
2997
2998
2999
...
解题思路:
该题在求解时要用到枚举的算法思想,即枚举所有的四位数(1000-9999),判断其是否满足十六进制、十二进制和十进制形式的各位数之和相等。
这里要注意进制转换方法。将一个十进制数Num转换到M进制,其方法是:将Num除以M取余数,直到商为0为止,存储得到的余数,先得到的余数为低位,后得到的余数为高位进行排序,余数0不能舍去。由于此题需要得到Num在16、12和10进制下各位的和,所以只要累加其余数即可。

算法设计与程序分析习题精选含答案(第四章)

算法设计与程序分析习题精选含答案(第四章)

算法设计与程序分析习题精选含答案(第四章)作业四4.1.2 Alternating glassesa. There are 2n glasses standing next to each other in a row, the first n of them filled with a soda drink and the remaining n glasses empty. Make the glasses alternate in a filled-empty-filled-empty pattern in the minimum number of glass moves. [Gar78]b. Solve the same problem if 2n glasses—n with a drink and n empty—are initially in a random order答:图1 杯子分组a.两个为一组,在前n个杯子中判断偶数的杯子是否为空,不为空与同组的进行交换,共需要交换n/2次,考虑n为奇数对n/2进行向下取整即可。

b.由于最终偶数位置为空杯,奇数位置为满杯,从第一项开始遍历,如果在奇数位置出现空杯与后面偶数位置出现的第一个满杯进行交换,如果偶数位置出现满杯则与后面奇数出现的第一个空杯进行交换,每次交换使得两个位置满足条件,最坏情况是2n位置均为乱序,则需要交换n次,最好的情况为2n位置均满足条件,则交换次数为[0,n]4.1.7 Apply insertion sort to sort the list E, X, A, M, P, L, E in alphabetical order.4.2.1 Apply the DFS-based algorithm to solve the topological sorting problem for the following digraphs:答:(a) fe gb ca d从堆栈中弹出:efgbcad,反转输出为:dacbgfe(b) 由于存在回环b图不是无向回环图。

计算机算法与设计复习题(含答案)

计算机算法与设计复习题(含答案)

1、一个算法的优劣可以用(时间复杂度)与(空间复杂度)与来衡量。

2、回溯法在问题的解空间中,按(深度优先方式)从根结点出发搜索解空间树。

3、直接或间接地调用自身的算法称为(递归算法)。

4、 记号在算法复杂性的表示法中表示(渐进确界或紧致界)。

5、在分治法中,使子问题规模大致相等的做法是出自一种(平衡(banlancing)子问题)的思想。

6、动态规划算法适用于解(具有某种最优性质)问题。

7、贪心算法做出的选择只是(在某种意义上的局部)最优选择。

8、最优子结构性质的含义是(问题的最优解包含其子问题的最优解)。

9、回溯法按(深度优先)策略从根结点出发搜索解空间树。

10、拉斯维加斯算法找到的解一定是(正确解)。

11、按照符号O的定义O(f)+O(g)等于O(max{f(n),g(n)})。

12、二分搜索技术是运用(分治)策略的典型例子。

13、动态规划算法中,通常不同子问题的个数随问题规模呈(多项式)级增长。

14、(最优子结构性质)和(子问题重叠性质)是采用动态规划算法的两个基本要素。

15、(最优子结构性质)和(贪心选择性质)是贪心算法的基本要素。

16、(选择能产生最优解的贪心准则)是设计贪心算法的核心问题。

17、分支限界法常以(广度优先)或(以最小耗费(最大效益)优先)的方式搜索问题的解空间树。

18、贪心选择性质是指所求问题的整体最优解可以通过一系列(局部最优)的选择,即贪心选择达到。

19、按照活结点表的组织方式的不同,分支限界法包括(队列式(FIFO)分支限界法)和(优先队列式分支限界法)两种形式。

20、如果对于同一实例,蒙特卡洛算法不会给出两个不同的正确解答,则称该蒙特卡洛算法是(一致的)。

21、哈夫曼编码可利用(贪心法)算法实现。

22概率算法有数值概率算法,蒙特卡罗(Monte Carlo)算法,拉斯维加斯(Las Vegas)算法和舍伍德(Sherwood)算法23以自顶向下的方式求解最优解的有(贪心算法)24、下列算法中通常以自顶向下的方式求解最优解的是(C)。

计算机算法设计与分析复习题与答案1

计算机算法设计与分析复习题与答案1

《算法分析与设计》期末复习题(一)一、选择题1.应用Johnson 法则的流水作业调度采用的算法是(D )A. 贪心算法B. 分支限界法C.分治法D. 动态规划算法2.Hanoi 塔问题如下图所示。

现要求将塔座A 上的的所有圆盘移到塔座B 上,并仍按同样顺序叠置。

移动圆盘时遵守Hanoi 塔问题的移动规则。

由此设计出解Hanoi 塔问题的递归算法正确的为:(B )Hanoi 塔3. 动态规划算法的基本要素为(C)A. 最优子结构性质与贪心选择性质B.重叠子问题性质与贪心选择性质C.最优子结构性质与重叠子问题性质D. 预排序与递归调用4. 算法分析中,记号O表示(B),记号Ω表示(A),记号Θ表示(D)。

A.渐进下界B.渐进上界C.非紧上界D.紧渐进界E.非紧下界5. 以下关于渐进记号的性质是正确的有:(A)A.f(n)(g(n)),g(n)(h(n))f(n)(h(n))=Θ=Θ⇒=ΘB. f(n)O(g(n)),g(n)O(h(n))h(n)O(f(n))==⇒=C. O(f(n))+O(g(n)) = O(min{f(n),g(n)})D. f(n)O(g(n))g(n)O(f(n))=⇔=6.能采用贪心算法求最优解的问题,一般具有的重要性质为:(A)A. 最优子结构性质与贪心选择性质B.重叠子问题性质与贪心选择性质C.最优子结构性质与重叠子问题性质D. 预排序与递归调用7. 回溯法在问题的解空间树中,按(D)策略,从根结点出发搜索解空间树。

A.广度优先B. 活结点优先 C.扩展结点优先 D. 深度优先8. 分支限界法在问题的解空间树中,按(A)策略,从根结点出发搜索解空间树。

A.广度优先B. 活结点优先 C.扩展结点优先 D. 深度优先9. 程序块(A)是回溯法中遍历排列树的算法框架程序。

A.B.C.D.10. 回溯法的效率不依赖于以下哪一个因素?(C )A.产生x[k]的时间;B.满足显约束的x[k]值的个数;C.问题的解空间的形式;D.计算上界函数bound的时间;E.满足约束函数和上界函数约束的所有x[k]的个数。

算法与程序设计总结习题答案

算法与程序设计总结习题答案

算法与程序设计总结答案1.分析问题设计算法编写程序调试程序获取结构2.有穷性确定性可行性输入输出3.0或多1或多4.判断变量的计算与赋值数据的输入或输出5.顺序结构选择结构循环结构6.整型integer 长整型long 单精度实型single 双精度实型double字符型string 逻辑性(布尔型)boolean 日期型date7.const 常量名as 类型=表达式或const 常量名=表达式const PI as single=3.14 或const PI=3.148.dim 变量名as 类型dim r as integer9.英文字母255 不区分10.inputbox r=val(inputbox(“输入r”)) 不能字符串11.print print r12.变量=表达式r=313.需要14.if 条件then 语句组1 else 语句组2if 条件then语句组1Else语句组2End ifa>=b print a+b print a-b15.+ - * / \ ^ mod > >= < <= < > = not and or2,3^3,2.5,2,false,false,false,true,true,123123,24616.算数表达式关系表达式逻辑表达式17.整型实型布尔型或逻辑性(二者写一个就可以)18.关系或逻辑19.for 循环变量=初值to 终值step 步长for i=1 to 10循环体print iNext 循环变量next i20.(1)计数 1 1 1;(2)可以大于;(3)((终值-初值)/步长)+1的整数部分10 11;(4)循环变量大于终值;(5)VB语句21.do do until 循环条件循环体循环体loop until 循环条件loop(1)结构1执行1次循环后再根据条件成立与否确定是否循环,结构2先判断条件,根据条件成立与否确定是否循环;(或者简答:结构1至少执行1次循环,结构2可能1次都不执行)(2)false,true;(3)不知道;(4)变化,增加1或减少122.结构1和结构2请参照do-until循环(1)请参照“21(1)”;(2)true,false;(3)循环条件相反;(4)需要,不存在23.窗体,caption;标签,caption;命令按钮,caption;文本框,text24.(1)标签,文本框,命令按钮;(2)---(4)caption;(5)text;(6)integer,integer,val,val(text2.text),a>b或a>=b,text3.text=str(a),text3.text= str(b);(7)对象名.属性名,command1.caption=”判断大小”;(8)对象名.属性名=表达式25.(1)val,将字符串转换为数值;(2)str,将数值转换为字符串26.(1)dim 数组名(下界to 上届) as 数据类型(2)dim 数组名(上届) as 数据类型(3)0(4)循环变量,下标,不可以;(5)单引号。

c程序设计题库及详解答案

c程序设计题库及详解答案

c程序设计题库及详解答案在C语言的学习过程中,掌握各类编程题目并理解其解答是至关重要的。

以下是一些常见的C程序设计题库及对应的详解答案。

1. 求两个数的最大公约数使用辗转相除法(欧几里得算法)可以求得两个数的最大公约数。

以下是求解的C程序代码:```c#include <stdio.h>int gcd(int a, int b) {while (b != 0) {int temp = b;b = a % b;a = temp;}return a;}int main() {int num1, num2;printf("请输入两个整数:");scanf("%d %d", &num1, &num2);printf("最大公约数是:%d\n", gcd(num1, num2));return 0;}```2. 计算一个数的阶乘阶乘是一个数与所有小于它的正整数的乘积。

以下是计算阶乘的C 程序代码:```c#include <stdio.h>long long factorial(int n) {if (n == 0)return 1;return n * factorial(n - 1);}int main() {int num;printf("请输入一个整数:");scanf("%d", &num);printf("%d 的阶乘是:%lld\n", num, factorial(num)); return 0;}```3. 判断一个数是否为素数素数是指只能被1和其本身整除的大于1的自然数。

以下是判断素数的C程序代码:```c#include <stdio.h>#include <math.h>int isPrime(int n) {if (n <= 1)return 0;for (int i = 2; i <= sqrt(n); i++) {if (n % i == 0)return 0;}return 1;}int main() {int num;printf("请输入一个整数:");scanf("%d", &num);if (isPrime(num))printf("%d 是素数。

算法复习题答案

算法复习题答案

算法复习题答案一、选择题1. 算法的时间复杂度是指:A. 算法执行所需的时间B. 算法执行所需的内存空间C. 算法执行时所需操作的数量D. 算法执行时占用的CPU资源答案:C2. 在排序算法中,最坏情况下时间复杂度为O(n^2)的排序方法是:A. 快速排序B. 归并排序C. 堆排序D. 冒泡排序答案:D3. 递归算法的基本原理是:A. 重复执行B. 循环执行C. 将问题分解为更小的子问题D. 将问题转化为更复杂的问题答案:C二、填空题1. 动态规划算法通常用于解决具有_______性质的问题。

答案:最优子结构2. 哈希表的冲突可以通过_______方法来解决。

答案:链地址法或开放地址法3. 贪心算法在每一步选择中都采取在当前状态下的_______操作。

答案:最优三、简答题1. 请简述二分查找算法的基本原理及其时间复杂度。

答案:二分查找算法是一种在有序数组中查找特定元素的算法。

其基本原理是将目标值与数组中间的元素进行比较,如果目标值等于中间元素,则查找成功;如果目标值小于中间元素,则在数组的左半部分继续查找;如果目标值大于中间元素,则在数组的右半部分继续查找。

这个过程将不断重复,直到找到目标值或查找范围为空为止。

二分查找算法的时间复杂度为O(log n)。

2. 什么是分治算法?请举例说明。

答案:分治算法是一种算法设计技术,它将一个复杂的问题分解成若干个规模较小但相似的子问题,递归地解决这些子问题,然后将子问题的解合并以解决原始问题。

例如,归并排序就是一种典型的分治算法,它将待排序的数组分成两半,分别对这两半进行排序,然后将排序好的两半合并成一个有序数组。

四、计算题1. 给定一个数组A = [3, 5, 1, 4, 2],请使用快速排序算法对其进行排序,并给出排序过程中的每一步操作。

答案:快速排序的基本思想是选择一个元素作为“基准”(pivot),然后将数组分为两部分,一部分包含所有小于基准的元素,另一部分包含所有大于基准的元素。

计算机算法设计与分析-期末考试复习资料

计算机算法设计与分析-期末考试复习资料

一、算法设计实例1、快速排序(分治法)int partition(float a[],int p,int r) {int i=p,j=r+1;float x=a[p];while(1){while(a[++i]<x);while(a[--j]<x);if(i>=j)break;swap(a[i],a[j]);}a[p]=a[j];a[j]=x;return j;}void Quicksort(float a[],int p,int r){//快速排序if(p<r){int q=partition(a,p,r);Quicksort(a,p,q-1);Quicksort(a,p+1,r);}}2、归并排序(分治法)void mergesort(Type a[],int left,int right) {if(left<rigth){int mid=(left+right)/2;//取中点mergesort(a,left,mid);mergesort(a,mid+1,right);mergesort(a,b,left,right);//合并到数组bmergesort(a,b,left,right);//复制到数组a}}3、背包问题(贪心算法)void knapsack(int n,float m,float v[],float w[],float x[]) {sort(n,v,w)//非递增排序int i;for(i=1;i<=n;i++)x[i]=0;float c=m;for(i=1;i<=n;i++){if(w[i]>c)break;x[i]=1;c-=w[i];}if(i<=n)x[i]=c/w[i];}4、活动安排问题(贪心算法)void Greadyselector(int n,Type s[],Type f[],bool A[]) {//s[i]为活动结束时间,f[j]为j活动开始时间A[i]=true;int j=1;for(i=2;i<=n;i++){if(s[i]>=f[j]){A[i]=true;j=i;}elseA[i]=false;}}5、喷水装置问题(贪心算法)void knansack(int w,int d,float r[],int n){//w为草坪长度d为草坪宽度r[]为喷水装置的喷水半径,//n为n种喷水装置,喷水装置的喷水半径>=d/2sort(r[],n);//降序排序count=0;//记录装置数for(i=1;i<=n;i++)x[i]=0;//初始时,所有喷水装置没有安装x[i]=0for(i=1;w>=0;i++){x[i]=1;count++;w=w-2*sqart(r[i]*r[i]-1);}count<<装置数:<<count<<end1;for(i=1;i<=n;i++)count<<喷水装置半径:<<r[i]<<end1;}6、最优服务问题(贪心算法)double greedy(rector<int>x,int s){rector<int>st(s+1,0);rector<int>su(s+1,0);int n=x.size();//st[]是服务数组,st[j]为第j个队列上的某一个顾客的等待时间//su[]是求和数组,su[j]为第j个队列上所有顾客的等待时间sort(x.begin(),x.end());//每个顾客所需要的服务时间升序排列int i=0,j=0;while(i<n){st[j]+=x[i];//x[i]=x.begin-x.endsu[j]+=st[j];i++;j++;if(j==s)j=0;}double t=0;for(i=0;i<s;i++)t+=su[i];t/=n;return t;}7、石子合并问题(贪心算法)float bebig(int A[],int n) {m=n;sort(A,m);//升序while(m>1){for(i=3;i<=m;i++)if(p<A[i])break;elseA[i-2]=A[i];for(A[i-2]=p;i<=m;i++){A[i-1]=A[i];m--;}}count<<A[1]<<end1}8、石子合并问题(动态规划算法)best[i][j]表示i-j合并化最优值sum[i][j]表示第i个石子到第j个石子的总数量|0f(i,j)=||min{f(i,k)+f(k+1,j)}+sum(i,j)int sum[maxm]int best[maxm][maxn];int n,stme[maxn];int getbest();{//初始化,没有合并for(int i=0;i<n;i++)best[i][j]=0;//还需要进行合并for(int r=1;r<n;r++){for(i=0;i<n-r;i++){int j=i+v;best[i][j]=INT-MAX;int add=sum[j]-(i>0!sum[i-1]:0);//中间断开位置,取最优值for(int k=i;k<j;++k){best[i][j]=min(best[i][j],best[i][k]+best[k+1][j])+add;}}}return best[0][n-1];}9、最小重量机器设计问题(回溯法)typedef struct Qnode{float wei;//重量float val;//价格int ceng;//层次int no;//供应商struct Qnode*Parent;//双亲指针}Qnode;float wei[n+1][m+1]=;float val[n+1][m+1]=;void backstack(Qnode*p){if(p->ceng==n+1){if(bestw>p->wei){testw=p->wei;best=p;}}else{for(i=1;i<=m;i++)k=p->ceng;vt=p->val+val[k][i];wt=p->wei+wei[k][i];if(vt<=d&&wt<=bestw){s=new Qnode;s->val=vt;s->wei=wt;s->ceng=k+1;s->no=1;s->parent=p;backstrack(S);}}}10、最小重量机器设计问题(分支限界法)typedef struct Qnode{float wei;//重量float val;//价格int ceng;//层次int no;//供应商struct Qnode*Parent;//双亲指针}Qnode;float wei[n+1][m+1]=;float val[n+1][m+1]=;void minloading(){float wt=0;float vt=0;float bestw=Max;//最小重量Qnode*best;s=new Qnode;s->wei=0;s->val=0;s->ceng=1;s->no=0;s->parent=null;Iinit_Queue(Q); EnQueue(Q,S);do{p=OutQueue(Q);//出队if(p->ceng==n+1){if(bestw>p->wei){bestw=p->wei;best=p;}}else{for(i=1;i<=m;i++){k=p->ceng;vt=p->val+val[k][i];wt=p->wei+wei[k][i];if(vt<=d&&wt<=bestw){s=new Qnode;s->ceng=k+1;s->wt=wt;s->val=val;s->no=i;s->parent=p;EnQueue(Q,S);}}}}while(!empty(Q));p=best;while(p->parent){count<<部件:<<p->ceng-1<<end1;count<<供应商:<<p->no<<end1;p=p->parent;}}11、快速排序(随机化算法—舍伍德算法)int partion(int a[],int l,int r){key=a[l];int i=l,j=r;while(1){while(a[++i]<key&&i<=r);while(a[--j]>key&&j>=l);if(i>=j)break;if(a[i]!=a[j])swap(a[i],a[j]);}if((j!=l)&&a[l]!=a[j])swap(a[l],a[j]);return j;}int Ranpartion(int a[],int l,int r) {k=rand()%(r-1+l)+1;swap(a[k],a[l]);int ans=partion(a,l,r);return ans;}int Quick_sort(int a[],int l,int r,int k){int p=Randpartion(a,l,r);if(p==k)return a[k];else if(k<p)return Quick_sort(a,l,p-1,k);else{int j=0;for(int i=p+1;i<=r;i++)b[j++]=a[i]return Quick_sort(b,1,j,k-p);}}12、线性选择(随机化算法—舍伍德算法)二、简答题1.分治法的基本思想分治法的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同。

算法与程序设计复习资料

算法与程序设计复习资料

算法与程序设计复习资料一、选择题1、用计算机解决问题的步骤一般为:(D )①编写程序②设计算法③分析问题④调试程序A.①②③④ B. ③④①② C. ②③①④ D. ③②①④2、下面不属于算法表示工具的是:(C)A.自然语言B.流程图C.机器语言D.伪代码3、结构化程序设计由三种基本结构组成,下面哪个不属于这三种基本结构之一(B )A.顺序结构B.环形结构C.选择结构D.循环结构4、下列数据属于字符串常量的是( B )。

A、abcB、“adk”C、D、’ewt’5、在VB语言中,下列数据中合法的整型数是( A )。

A、245B、58723C、123.85D、1.D+126、在VB语言中,下列表达式中合法的表达式是( C )。

A、a+b*≤fB、bct÷7C、pi*2*rD、α*β*π7、下列给出的赋值语句中正确的是( C )。

A、4 = MB、-M =MC、B=A-3D、x + y = 08、下列Visual Basic中,( D )的表达式的值不等于4。

A、int(4.1)B、int(4.9)C、Abs(int(-3.9))D、Abs(int(-4.5))9、以下程序中的循环体执行的次数是( C )。

Private Sub Command1_Click()For A=1 To 100 Step 2S=S+ANext APrint SEnd SubA、48B、49C、50D、5110、若a=10,b=15,则print a;”+”;b;”=”,a+b的结果为( D )A、a+b=25B、10+15=25C、a+b= 25D、10+15= 2511、在程序设计的过程中,有时需要将几个不同的字符串连接起来,这时需要用到字符串运算符号"+"。

如:"ab"+"bc"的运算结果是"abbc",那么"27"+"73"的运算结果是( D )。

计算机算法经典试题参考解答

计算机算法经典试题参考解答

1 给出一个()()C A B B A =-⋃-的算法解:假设A 中元素个数为n,B 中元素个数为m. 1. 算法思想:输入两个序列A 、Ba.分别对A 、B 进行归并排序b.同时扫描A 、B,设两个指针分别指向A 、B 的当前扫描元素。

初始时i 、j 分别指向A[0]、B[0]c. 若A[i]< B[j]则将A[i]存入C 中,i 后移 若A[i]>B[j] 则将B[j]存入C 中,j 后移若A[i]= B[j] 则同时将i 、j 后移,直到分别出现与其前一个元素值不同的元素为止。

d 重复c 直至A 、B 同时扫描完或某一个扫描完,此时将另一个序列所有剩余元素直接 插入C 中即可。

归并排序的时间复杂度为)log log (22m m n n O +,扫描的时间复杂度为)(m n O +,总的时间复杂度为)log log (22m m n n O +。

2书后习题4.8a. How many key comparisons would be done in the worst case?b. How many times are elements moved in the worst case?c. What is the asymptotic order of the worst-case running time?d. Can the number of moves be reduced by putting the elements in a linked list instead of an array? Explain.答案:a. ⎣⎦1log 2+i ; b. i+2次; c. )(i Od. 采用链式存储结构可以减少移动次数,但这种结构不能使用折半查找。

3输入n 个元素,输出其不同元素。

(O(nlogn))答案:n 个元素保存在数组E[n]中;(1) 对E[n]进行排序(归并等时间复杂度为)log (2n n O 的算法); (2) 直接输出E[0];(3) FOR i=1 TO n-1, 如果(E[i]==E[i-1]) 忽略该元素;否则输出E[i]。

计算机程序设计基础复习 题集附答案

计算机程序设计基础复习 题集附答案

计算机程序设计基础复习题集附答案计算机程序设计基础复习题集附答案1. 基础知识篇1.1 数据类型在计算机程序设计中,数据类型是非常重要的概念,它决定了我们可以对数据进行的操作以及占用的存储空间大小。

常见的数据类型有整型、浮点型、字符型等。

以下是一些数据类型的介绍:1.1.1 整型(int)整型是用来表示整数的数据类型,可以存储正整数、负整数以及零。

在大多数编程语言中,整型的大小一般为4个字节(32位),可以表示的范围是从-2,147,483,648到2,147,483,647。

1.1.2 浮点型(float)浮点型用来表示带有小数部分的数值,例如 3.14 或者 2.718。

浮点型的大小一般为4个字节(32位),可以表示的范围比整型更大。

1.1.3 字符型(char)字符型用来表示单个字符,例如 'a'、'b' 或者 '1'。

字符型的大小一般为1个字节(8位)。

1.2 运算符在程序设计中,运算符用于对数据进行运算和操作。

常见的运算符包括加法、减法、乘法、除法等。

以下是一些常见的运算符及其使用方法:1.2.1 算术运算符算术运算符用于进行基本的算术运算,包括加法(+)、减法(-)、乘法(*)、除法(/)等。

1.2.2 关系运算符关系运算符用于比较两个值的大小关系,常见的关系运算符包括等于(==)、不等于(!=)、大于(>)、小于(<)、大于等于(>=)和小于等于(<=)。

1.2.3 逻辑运算符逻辑运算符用于组合多个条件,进行复合的逻辑判断。

常见的逻辑运算符包括与(&&)、或(||)和非(!)。

1.3 控制流程控制流程指的是程序的执行流程,即代码在何种条件下执行哪一段代码。

常见的控制流程包括顺序结构、选择结构和循环结构。

1.3.1 顺序结构顺序结构即代码按照书写顺序依次执行,没有分支或循环。

1.3.2 选择结构选择结构根据条件的不同,选择性地执行不同的代码块。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《计算机常用算法与程序设计案例教程》习题解答提要习题11-1 分数分解算法描述把真分数a/b 分解为若干个分母为整数分子为“1”的埃及分数之和:(1) 寻找并输出小于a/b 的最大埃及分数1/c ;(2) 若c>900000000,则退出;(3) 若c ≤900000000,把差a/b-1/c 整理为分数a/b ,若a/b 为埃及分数,则输出后结束。

(4) 若a/b 不为埃及分数,则继续(1)、(2)、(3)。

试描述以上算法。

解:设)(int a b d = (这里int(x)表示取正数x 的整数),注意到1+<<d ab d ,有 )1()1(11+-+++=d b bd a d b a算法描述:令c=d+1,则input (a,b)while(1){c=int(b/a)+1;if(c>900000000) return;else{ print(1/c+);a=a*c-b;b=b*c; // a,b 迭代,为选择下一个分母作准备if(a==1){ print(1/b);return;}}}1-2 求出以下程序段所代表算法的时间复杂度(1)m=0;for(k=1;k<=n;k++)for(j=k;j>=1;j--)m=m+j;解:因s=1+2+…+n=n(n+1)/2时间复杂度为O(n2)。

(2)m=0;for(k=1;k<=n;k++)for(j=1;j<=k/2;j++)m=m+j;解:设n=2u+1,语句m=m+1的执行频数为s=1+1+2+2+3+3+…+u+u=u(u+1)=(n−1)(n+1)/4设n=2u,语句m=m+1的执行频数为s=1+1+2+2+3+3+…+u=u2=n2/4时间复杂度为O(n2)。

(3)t=1;m=0;for(k=1;k<=n;k++){t=t*k;for(j=1;j<=k*t;j++)m=m+j;}解:因s=1+2×2!+ 3×3!+…+ n×n!=(n+1)!−1时间复杂度为O((n+1)!).(4)for(a=1;a<=n;a++){s=0;for(b=a*100−1;b>=a*100−99;b−=2){for(x=0,k=1;k<=sqrt(b);k+=2)if(b%k==0){x=1;break;}s=s+x;}if(s==50)printf("%ld \n",a);break;}}解:因a循环n次;对每一个a,b循环50次;对每一个b,k2次。

因而k循环体的执行次数s满足1001)250(12)250250s n n +-+++<<<时间复杂度为O(n n )。

1-3 若p(n)是n 的多项式,证明:O(log(p(n)))=O(logn)。

证:设m 为正整数,p(n)=a1×n m +a2×n m-1+…+am ×n ,取常数c>ma1+(m-1)a2+…+am, 则log(p(n))=ma1×logn+(m-1)a2×logn+…=(ma1+(m-1)a2+…)×logn<clogn因而有O(log(p(n)))=O(logn)。

1-4 构建对称方阵观察图1-5所示的7阶对称方阵:图1-5 7阶对称方阵试构造并输出以上n 阶对称方阵。

解:这是一道培养与锻炼我们的观察能力与归纳能力的案例,一个一个元素枚举赋值显然行不通,必须全局着眼,分区域归纳其构造特点,分区域枚举赋值。

(1) 设计要点设方阵中元素的行号为i ,列号为j 。

可知主对角线:i=j ;次对角线:i+j=n+1。

两对角线赋值“0”。

按两条对角线把方阵分成上部、左部、右部与下部4个区,如图1-6所示。

图1-6 对角线分成的4个区上部按行号i 赋值;下部按行号函数n+1-i 赋值。

左部按列号j 赋值;右部按列号函数n+1-j 赋值。

(2) 程序实现#include <stdio.h>void main(){int i,j,n,a[30][30];printf(" 请确定方阵阶数n: ");scanf("%d",&n);for(i=1;i<=n;i++)for(j=1;j<=n;j++){if(i==j || i+j==n+1)a[i][j]=0; // 方阵对角线元素赋值if(i+j<n+1 && i<j)a[i][j]=i; // 方阵上部元素赋值if(i+j<n+1 && i>j)a[i][j]=j; // 方阵左部元素赋值if(i+j>n+1 && i>j)a[i][j]=n+1-i; // 方阵下部元素赋值if(i+j>n+1 && i<j)a[i][j]=n+1-j; // 方阵右部元素赋值}printf(" %d阶对称方阵为:\n",n);for(i=1;i<=n;i++){ for(j=1;j<=n;j++) // 输出对称方阵printf("%3d",a[i][j]);printf("\n");}}1-5 据例1-2的算法,写出求解n个“1”组成的整数能被2011整除的程序。

修改程序,求出 n至少为多大时,n个“1”组成的整数能被2013整除?解:程序为#include <stdio.h>void main(){ int a,c,p,n;p=2011;c=1111;n=4; // 变量c与n赋初值while(c!=0) // 循环模拟整数竖式除法{ a=c*10+1;c=a%p;n=n+1; // 每试商一位n增1}printf(" 由 %d 个1组成的整数能被 %d 整除。

\n",n,p);}习题22-1 解不等式设n 为正整数,解不等式2011/12/1113/12/1112/11112010<++++++++++<n解:上下限一般为键盘输入的a,b 。

// 解不等式: a<1+1/(1+1/2)+...+1/(1+1/2+...+1/n)<b#include <stdio.h>#include<math.h>void main(){ long a,b,c,d,i;double ts,s;printf(" 请输入a,b: ");scanf("%d,%d",&a,&b);i=0;ts=0;s=0;while(s<a){ i=i+1;ts=ts+(double)1/i;s=s+1/ts;}c=i;while(s<b){i=i+1;ts=ts+(double)1/i;s=s+1/ts;}d=i-1;printf("\n 满足不等式的正整数n 为: %ld ≤n ≤%ld \n",c,d);}2-2 信点兵信在点兵的时候,为了知道有多少个兵,同时又能保住军事,便让士兵排队报数。

按从1至5报数,记下最末一个士兵报的数为1;再按从1至6报数,记下最末一个士兵报的数为5;再按1至7报数,记下最末一个报的数为4;最后按1至11报数,最末一个士兵报的数为10。

你知道信至少有多少兵?1. 求解要点设兵数为x,则x满足下述的同余方程组:x=5y+1 即 x=1 (mod 5)x=6z+5 x=5 (mod 6)x=7u+4 x=4 (mod 7)x=11v+10 x=10 (mod 11)其中y,z,u,v都为正整数。

试求满足以上方程组的最小正整数x。

应用枚举可得到至少的兵数。

x从1开始递增1取值枚举当然可以,但不必要。

事实上枚举次数可联系问题的具体实际大大缩减。

(1) 注意到x除11余10,于是可设置x从21开始,以步长11递增。

此时,只要判别前三个条件即可。

(2) 由以上第2,4两方程知x+1为11的倍数,也为6的倍数。

而11与6互素,因而x+1必为66的倍数。

于是取x=65开始,以步长66递增。

此时,只要判别x%5=1与x%7=4 两个条件即可。

这样可算得满足条件的最小整数x即点兵的数量。

2. 程序实现// 信点兵#include <stdio.h>void main(){ long int x;x=65;while(1){ x=x+66;if(x%5==1 && x%7==4){ printf("至少有兵: %ld 个。

",x);break;}}}2-3 分解质因数对给定区间[m,n]的正整数分解质因数,•每一整数表示为质因数从小到大顺序的乘积形式。

如果被分解的数本身是素数,则注明为素数。

例如, 2012=2*2*503, 2011=(素数!)。

解:对区间中的每一个整数i(b=i),用k(2——sqrt(i))试商:若不能整除,说明该数k不是b的因数,k增1后继续试商。

若能整除,说明该数k是b的因数,打印输出"k*";b除以k的商赋给b(b=b/k)•后继续用k试商(注意,可能有多个k因数),直至不能整除,k增1后继续试商。

按上述从小至大试商确定的因数显然为质因数。

如果有大于sqrt(n)的因数(至多一个!)•,在试商循环结束后要注意补上,不要遗失。

如果整个试商后b的值没有任何缩减,仍为原待分解数n,说明n是素数,作素数说明标记。

若k是b的因数,按格式输出,然后b=b/k后继续试商k。

若k不是b的因数,则k增1后继续。

若上述试商完成后1<b<i,说明i有一个大于sqrt(i)的因数,要补上该因数。

若试商后b还是原来的i,则i是素数。

// 质因数分解乘积形式#include"math.h"#include <stdio.h>void main(){long int b,i,k,m,n,w=0;printf("[m,n]中整数分解质因数(乘积形式).\n");printf("请输入m,n:");scanf("%ld,%ld",&m,&n);for(i=m;i<=n;i++) // i为待分解的整数{ printf("%ld=",i);b=i;k=2;while(k<=sqrt(i)) // k为试商因数{if(b%k==0){b=b/k;if(b>1){printf("%ld*",k);continue; // k为质因数,返回再试}if(b==1) printf("%ld\n",k);}k++;}if(b>1 && b<i)printf("%ld\n",b); // 输出大于i平方根的因数if(b==i){printf("(素数!)\n");w++;} // b=i,表示i无质因数}}2-4 基于素数代数和的最大最小定义和:⨯+⨯±±++nsn=n⨯⨯-9⨯2()1)12(775)(+3153(和式中第k项±(2k-1)*(2k+1)的符号识别:当(2k-1)与(2k+1)中至少有一个素数,取“+”;其余取“-”。

相关文档
最新文档