ImageVerifierCode 换一换
格式:DOCX , 页数:56 ,大小:102.62KB ,
资源ID:10572031      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/10572031.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(算法设计题集.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

算法设计题集.docx

1、算法设计题集算法设计题集第一章 算法初步第一节 程序设计与算法 一、算法 算法是解决问题方法的精确描述,但是并不是所有问题都有算法,有些问题经研究可行,则相应有算法,但这并不是说问题就有结果。上述的“可行”,是指对算法的研究。 待解问题的描述 待解问题表述应精确、简练、清楚,使用形式化模型刻划问题是最恰当的。例如,使用数学模型刻划问题是最简明、严格的,一旦问题形式化了,就可依据相应严格的模型对问题求解。 算法设计 算法设计的任务是对各类具体问题设计良好的算法及研究设计算法的规律和方法。常用的算法有:穷举搜索法、递归法、回溯法、贪心法、分治法等。 算法分析 算法分析的任务是对设计出的每一个具体的

2、算法,利用数学工具,讨论各种复杂度,以探讨某种具体算法适用于哪类问题,或某类问题宜采用哪种算法。 算法的复杂度分时间复杂度和空间复杂度。 时间复杂度:在运行算法时所耗费的时间为f(n)(即n的函数)。 空间复杂度:实现算法所占用的空间为g(n)(也为n的函数)。 称O(f(n)和O(g(n)为该算法的复杂度。 二、程序设计 程序 程序是对所要解决的问题的各个对象和处理规则的描述,或者说是数据结构和算法的描述,因此有人说,数据结构算法程序。 程序设计 程序设计就是设计、编制和调试程序的过程。 结构化程序设计 结构化程序设计是利用逐步求精的方法,按一套程式化的设计准则进行程序的设计。由这种方法产生

3、的程序是结构良好的。所谓“结构良好”是指: ()易于保证和验证其正确性; ()易于阅读、易于理解和易于维护。 按照这种方法或准则设计出来的程序称为结构化的程序。 “逐步求精”是对一个复杂问题,不是一步就编成一个可执行的程序,而是分步进行。 第一步编出的程序最为抽象; 第二步编出的程序是把第一步所编的程序(如过程、函数等)细化,较为抽象; 第i步编出的程序比第i-1步抽象级要低; 直到最后,第n步编出的程序即为可执行的程序。 所谓“抽象程序”是指程序所描述的解决问题的处理规则,是由那些“做什么”操作组成,而不涉及这些操作“怎样做”以及解决问题的对象具有什么结构,不涉及构造的每个局部细节。 这一方

4、法原理就是:对一个问题(或任务),程序人员应立足于全局,考虑如何解决这一问题的总体关系,而不涉及每局部细节。在确保全局的正确性之后,再分别对每一局部进行考虑,每个局部又将是一个问题或任务,因而这一方法是自顶而下的,同时也是逐步求精的。采用逐步求精的优点是: ()便于构造程序。由这种方法产生的程序,其结构清晰、易读、易写、易理解、易调试、易维护; ()适用于大任务、多人员设计,也便于软件管理。 逐步求精方法有多种具体做法,例如流程图方法、基于过程或函数的方法。 例求两自然数,其和是667,最小公倍数与最大公约数之比是120:1(例如(115,552) 、(232,435))。 解两个自然数分别为

5、m和667-m(2m 333)。 处理对象:m(自然数)、l(两数的最小公倍数)、g(两数的最大公约数)。 处理步骤:对m从到333检查l与g的商为120,且余数为0时,打印m与667-m 。 第一层抽象程序: Program TwoNum; Var m,l,g:integer; Begin for m:=2 to 333 do begin l:=lcm(m,667-m); 求最小公倍数 g:=gcd(m,667-m); 求最大公约数 if (l=g*120)and(l mod g=0) then writeln(m:5,667-m:5); end; End. 第二层考虑函数lcm(最小公倍数

6、)、gcd(最大公约数)的细化。 最大公约数问题是对参数a、b,找到一个数i能整除a与b,i就是gcd的函数值。 Function gcd(a,b:integer):integer; var i:integer; begin for i:=a downto 1 do if not(a mod i=0)or(b mod i=0) then gcd:=i; end; 而最小公倍数的计算是:若干个b之和,若能被a整除,则该和便是a、b的最小公倍数。 Function lcm(a,b:integer):integer; var i:integer; begin i:=b; while i mod a=

7、0 do i:=i+b; lcm:=i; end;第二节 编程入门题例编程入门题(一)1、位数对调:输入一个三位自然数,把这个数的百位与个位数对调,输出对 调后的数。例如:Input 3 bit natrue data:234 n=432 解1.先确定输入数n是否三位数,即n99且n99) and (n=0,则求面积:area=,并输出area的值。程序PROGRAM hl;VAR a,b,c,s,x,area:real;BEGIN write(Input a,b,c:);readln(a,b,c); If (a0) and (b0) and (c0) and (a+bc)and(a+cb)a

8、nd(b+ca) Then Begin s:=(a+b+c)/2; x:=s*(s-a)*(s-b)*(s-c); If x=0 Then Begin Area:=SQRT(x);writeln(Area=,area:8:5); End; End Else writeln(Input error!)END.3、模拟计算器:试编写一个根据用户键入的两个操作数和一个运算符,由计算机输出运算结果的程序。这里只考虑加()、减()、乘()、除()四种运算。 例:Input x,y:15 3 Input operator(+,-,*,/): 15.00+ 3.00= 18.00 例:Input x,y:5

9、 0 Input operator(+,-,*,/): divide is zero!解该题关键是判断输入的两数是作何种运算(由输入的运算符operator决定, 如+、-、*、/分别表示加、减、乘、除法的运算)。其中要进行除(/)运算时,要先进行合法性检查,即除数不能为0。程序PROGRAM Oper;Var x,y,n:real; operator:char;Begin write(Input x,y:);readln(x,y); write(Input operator:);readln(operator); Case operator of +:n:=x+y; 加法运算 -:n:=x-

10、y; 减法运算 *:n:=x*y; 乘法运算 /:If y=0 then 除法运算 begin writeln(Divide is zero!);halt;end Else n:=x/y; else begin writeln(Input operator error!);halt;end; End; writeln(x:6:2,operator,y:6:2,=,n:6:2);End.4、念数字:编一个“念数字”的程序,它能让计算机完成以下工作:当你输入一个至99之间的数后,计算机就会用汉字拼音印出这个数的念结束。例:Input data:35 SAN SHI WU 例:Input data:

11、0 LING 如果输入的数不在到99之间,就印出“CUO LE”(错了),请求重新输入。 注:为了使不熟悉汉语拼音的同学也能做这个题,把“零,一,二,三,九,十”的拼音法写在下面。 零 LING 一 YI 二 ER 三 SAN 四 SHI 五 WU 六 LIU 七 QI 八 BA 九 JIU 十 SHI解输入数在099之间,若x为两位数则拆分为十位数、个位数。然后调用念 数过程Readdigit用汉字拼音印出各位数(09)的念。程序$I-Program NinShu;Var x,a,b:Integer;Procedure ReadDigit(n:Integer);念数过程:n=09Begin

12、Case n of 0:write(LING ); 1:write(YI ); 2:write(ER ); 3:write(SAN ); 4:write(SHI ); 5:write(WU ); 6:write(LIU ); 7:write(QI ); 8:write(BA ); 9:write(JIU ); End;End; ReadDigitBegin main Repeat write(Input data:);readln(x); if (x99) then writeln(Cuo Le); Until (x=0)and(x=0)and(x=9) then ReadDigit(x) 调

13、用念数过程 Else Begin a:=x DIV 10; b:=x mod 10; 位数拆分 If a1 then ReadDigit(b); writeln( Shi); if b0 then ReadDigit(b); End; writeln;End.5、数列找数:数组A(N)的各下标变量中个互不相等的数,键盘输入正整数(),要求打印数组中第大的下标变量的值。 例如:数组A(10)的数据为:A(1)A(2)A(3)A(4)A(5)A(6)A(7)A(8)A(9)A(10) 16 57 20 19 38 41 6 13 25 32运行结果:INPUT AN NUMBER: A(5)=38

14、 (即第大的数是A(5)=38) 解该题要从N个互不相等的数中找第M大的值。有以下两种解法:解法一:初始时:A数组存放N个互不相等的数;B数组用于存放数组A的下标。见下表一。下标值i 1 2 3 4 5 6 7 8 9 10数组A 16 57 20 19 38 41 6 13 25 32数组B 1 2 3 4 5 6 7 8 9 10 降序处理(冒泡排序法): 数组A的元素由大到小进行排序,同时数组B的元素排列也随之变化。下标值I 1 2 3 4 5 6 7 8 9 10数组A 57 41 38 32 25 20 19 16 13 6数组B(原数组A的下标) 2 6 5 10 9 3 4 1

15、8 7例题中M=3,由表二知A3=38,B3=BM=5(原数组A的下标值)即为所求。程序Program Max01;冒泡排序法var i,j,n,m,x:integer; A,B:ARRAY1.100 of integer;Procedure Init; 读数初始化过程Var i,j:integer; fd:boolean;Begin write(Input N:);readln(N); 读入N if N1 then begin writeln(Input error!);halt;end; write(Input ,N:3, Data:); For i:=1 to n Do begin re

16、ad(Ai);Bi:=i;end;读入Ai,且Bi初值置为i Readln; i:=1; fd:=false; 数组中的数有相同的标志 while NOT fd and (i=N-1) do Begin j:=i+1; While NOT fd and (jN then 表明所找的数M已超过输入数的总数N begin writeln(Input error!);halt;end;End; InitBegin MAIN Init; 读数过程 for i:=1 to N-1 do 冒泡排序 for j:=i+1 to N do if AiAj then begin x:=Ai;Ai:=Aj;Aj:

17、=x; 交换Ai与Aj的值 x:=Bi;Bi:=Bj;Bj:=x; 交换Bi与Bj的值 end; writeln(A(,BM,)=,AM); 输出第M大的数、原下标值End. 解法二(搜索法):用Bi表示在A1、A2、A3、AN中比Ai大的个数(i=1,2,3,N)。搜索的结果见下表三:下标值i 1 2 3 4 5 6 7 8 9 10A数组 16 57 20 19 38 41 6 13 25 32B数组 8 1 6 7 3 2 10 9 5 4例题中M=3,由表三知B5=3=M,A5=38即为所求。程序Var i,j,k,m,n:integer; A,B:ARRAY1.100 of inte

18、ger;Procedure Init;具体程序见解法一Begin MAIN Init; 读数过程 for i:=1 to n do begin Bi:=1; Bi初始值为1,即假定所有Ai都可能为最大数 for j:=1 to n do if (ij) and (Ai5时就不用再搜索下去。因此,可对解法二的算法优化如下:1 读数至A数组2 i=1;fd=false; fd:判断是否已找到所求数的标志当 (fd=false)and(I=n) 时,做 (1)Bi=1 表示数列中比Ai小的数的总个数+1,初始值为1 (2)j=1 (3)当j=n时,做 如果(ij)and(AiAj),则Bi的值加1。

19、 j=j+1 (4)如果Bi=M,则输出所求:Ai,且fd=true。 (5)i=i+14.程序结束。主程序Begin MAIN Init;读数过程 i:=1;fd:=false;找到所求解的标志值 while not fd and (i=N) do begin Bi:=1; Bi初始值为1,即假定所有的Ai都可能为最大的数 j:=1; while j=n do begin if (ij)and(AiAj) then Bi:=Bi+1; j:=j+1; end; while j if Bi=M then 找到所求便输出,并退出比较 begin writeln(A(,i,)=,Ai);fd:=t

20、rue; end; i:=i+1; end;while iEnd.6、数制转换:编程输入十进制(:-3276732767),请输出它对应的二 进制、八进制、十六进制数。例如: INPUT N(-3276732767):222 222 TURN INTO 2:11011110 222 TURN INTO 8:336 222 TURN INTO 16:DE解十进制数转化为某进制数的转换方法,如下图示: 除x逆序取余法 十进制数 x进制数(x=2,8,16等) 例中n=222(十进制数),转换成x进制数的过程如下图示:(1)十进制数二进制数 (2)十进制数八进制数 (3)十进制数十六进制数 x=2

21、222 被除数(最大商) x=8 222 6 x=16 222 E (14)10 2 111 0 低位 8 27 3 16 13 D (13)10 2 50 1 逆 8 3 3 0 2 25 0 余 序 0 2 12 0 数 取 2 6 0 余 2 3 1 数 2 1 1 高位 0 (最大商为0时停止) 将每次所得的余数由下至上排列(逆序取余数),即有: (222)10 转换成二进制数得到:1100010 (222)10 转换成八进制数得到:336 (222)10 转换成十六进制数得到:13、14 这时得到的逆序余数串(在数组B1、B2、Bk中)的每位数均为十进制数。程序中利用字符串A来计算x

22、进制数的位数(即COPY(A,Bi+1,1),见下表: 数组B 0 12345678 9101112131415 字串A 0 123456 7 8 9 A B C D E F 下标i 12345678910111213141516 由上表得:(222)10=(1100010)2=(336)8=(DE)16程序$I-Program jj;var N,k:integer; B:array1.1000 of integer;Procedure chg10(N,x:integer); 将十进制数N转换成x进制数Begin k:=0; 转换后的x进制数位的长度 while N0 do N不为0时 beg

23、in Bk:=N mod x; 除以x取余数 N:=N Div x; 取最大商N k:=k+1; x进制数位加1 end;end;chg10Procedure Sput(N,x:integer);进制数输出VAR i:integer; A:string; Begin A:=0123456789ABCDEF; 表示x进制数的位数串 write(N:6, Turn into ,x:2,:); for i:=k-1 downto 0 do write(copy(A,Bi+1,1);逆序输出x进制数 writeln;end; Sputbegin MAIN write(Input N(-32767 to

24、 32767):);readln(N); if (N32767) then begin writeln(Input error!);halt;end; chg10(N,2);Sput(N,2); 十进制数转换成2进制数,并输出 chg10(N,8);Sput(N,8); 十进制数转换成8进制数,并输出 chg10(N,16);Sput(N,16); 十进制数转换成16进制数,并输出end._编程入门题(二)1、求素数:求2至N(2N500)之间的素数。例如:输入:N=100输出: 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 71 73 79 83 89 97 total=24 表示2至100之间的素数有24个解法一素数是指除1及本身以外不能被其他数整除的自然数。下面介绍用穷举法求素数。1 2是素数;t=0;2 I=2n,则:(1)如果i是素数,则其必须是奇数且不能被2i 中的任一个数整除。 (2)如果I是素数,则输出该素数且计数器t=t+1; 3输出2N之间素数的总数:total=t;4程序结束程序program exa;uses crt;var i,k,n,w,t:intege

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1