pascal编程入门.pdf

上传人:索**** 文档编号:76254067 上传时间:2023-03-08 格式:PDF 页数:30 大小:183.32KB
返回 下载 相关 举报
pascal编程入门.pdf_第1页
第1页 / 共30页
pascal编程入门.pdf_第2页
第2页 / 共30页
点击查看更多>>
资源描述

《pascal编程入门.pdf》由会员分享,可在线阅读,更多相关《pascal编程入门.pdf(30页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

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))。解 两个自然数分别为m和 667-m(2 m 333)。处理对象:m(自

5、然数)、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(最小公倍数)、gcd(最大公约数)的细化。最大公约数问题是对参

6、数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=0 do i:=i+b;lcm:=i;end;第二

7、节编程入门题例编程入门题(一)1、位数对调:输入一个三位自然数,把这个数的百位与个位数对调,输出对调后的数。例如:Input 3 bit natrue data:234 n=432 解 1.先确定输入数n 是否三位数,即n99 且 n99)and(n=0,则求面积:area=x,并输出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)and(b+ca)Then Begin s:=(a+b+c)/2;

8、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 0 Input operator(+,-,*,/):divide is zero

9、!解 该题关键是判断输入的两数是作何种运算(由输入的运算符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-y;减法运算 *:n:=x*y;乘法运算 /:If y=0 then 除法运算 begin

10、 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:0 LING如果输入的数不在到99 之间,就印出“CUO LE”(错了),请求重新输入。注:为了使

11、不熟悉汉语拼音的同学也能做这个题,把“零,一,二,三,,,九,十”的拼音法写在下面。零 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=0 9 Begin Case n of 0:write(LING);1:write(YI);2:write

12、(ER);3:write(SAN);4:write(SHI);5:write(WU);6:write(LIU);7:write(QI);8:write(BA);9:write(JIU);End;End;ReadDigit Begin 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)调用念数过程 Else Begin a:=x DIV 10;b:=x mod 10;位数拆分 If a1 then ReadDigit(b);

13、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 (即第大的数是A(5)=38)解 该题要从N个互不相等的数中找第M大的值。有以下两种解法:解法一:初始时:A数组存放N个互不相等的数;B数组用于存放数组A

14、的下标。见下表一。下标值 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 8 7 例题中 M=3,由表二知A3=38,B3=BM=5(原数组A的下标值)即为所求。程序 Program Max01;冒泡排序法 v

15、ar 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 read(Ai);Bi:=i;end;读入 Ai,且 Bi初值置为i Readln;i:=1;fd:=false;数组中的数有相同的标志 whi

16、le 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;Init Begin 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:=x;交换 Ai与 Aj的值 x:=Bi;Bi:=Bj;Bj:=x;交换 Bi与 Bj的值 end;writeln(A(,BM,)=,AM);输出第 M

17、大的数、原下标值 End.解法二(搜索法):用Bi表示在A1、A2、A3、AN 中比Ai大的个数(i=1,2,3,N)。搜索的结果见下表三:解法二(搜索法):用 Bi表示在A1、A2、A3、AN 中比Ai大的个数(i=1,2,3,N)。搜索的结果见下表三:下标值 i 1 2 3 4 5 6 7 8 9 10 A数组 16 57 20 19 38 41 6 13 25 32 B数组 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 integer;Proced

18、ure 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 时就不用再搜索下去。因此,可对解法二的算法优化如下:读数至A数组 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。j=j+1(4)如果 Bi=M,

19、则输出所求:Ai,且 fd=true。(5)i=i+1 4.程序结束。主程序 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:=true;end;i:=i+1;end;whil

20、e i End.6、数制转换:编程输入十进制(:-32767 32767),请输出它对应的二进制、?八进制、十六进制数。例如: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 222 被除数(最大商)x=8 222 6

21、 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 进制数的位数(即COPY(A,Bi+1,1),见

22、下表:数组 B 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 字串 A 0 1 2 3 4 5 6 7 8 9 A B C D E F 下标 i 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 由上表得:(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

23、 do N不为 0 时 begin Bk:=N mod x;除以 x 取余数 N:=N Div x;取最大商N k:=k+1;x进制数位加1 end;end;chg10 Procedure 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;Sput begin MAIN write(Inpu

24、t N(-32767 to 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 5

25、9 61 71 73 79 83 89 97 total=24 表示 2 至 100 之间的素数有24 个 解法一 素数是指除1 及本身以外不能被其他数整除的自然数。下面介绍用穷举法求素数。2 是素数;t=0;I=2 n,则:(1)如果 i 是素数,则其必须是奇数且不能被2 i 中的任一个数整除。(2)如果 I 是素数,则输出该素数且计数器t=t+1;3输出 2N之间素数的总数:total=t;4程序结束 程序 program exa;uses crt;var i,k,n,w,t:integer;yes:boolean;Begin t:=0;clrscr;write(N=);readln(n)

26、;if(n500)then begin writeln(input error!);halt;end;write(2:5);t:=1;for i:=2 to n do if odd(i)then begin yes:=true;w:=trunc(sqrt(I);k:=2;while(k=w)and yes do begin if i mod k=0 then yes:=false;k:=k+1;end;if yes then begin write(i:5);t:=t+1;end;end;writeln(total=,t);end.end.解法二 筛法求素数:1建立一个包括2,3,,,N的数据

27、“集合”R;2顺序取 R中的数(从素数2 开始),同时将其及能整除它的数从R中划去。“筛法求素数”的过程如下图示:素数R1 数据集合R 2 2,3,4,5,6,7,8,9,10,11,12,,3 3,5,7,9,11,,5 5,7,11,,这样便可得到所求的素数:2,3,5,,。程序 program Sushu;var i,j,k,n,w,t:integer;R,P:array 1.500 of integer;Begin write(N=);readln(n);if(n500)thenbegin writeln(Input N error!);halt end;for i:=2 to n d

28、o Ri-1:=i;writeln(Result:);t:=0;k:=n-1;while k0 do begin P:=R;数组 P保存在 P中 write(R1:5);输出素数 t:=t+1;w:=R1;j:=0;for i:=1 to k do if Pi mod w0 then 划去 w及 W的倍数 begin j:=j+1;Rj:=Pi;end;重新构造集合R k:=j;新建后 R的元素个数 end;writeln;writeln(Total=,t);end.2、矩阵相乘:已知 N M1矩阵 A和 M1 M矩阵 B(1M、M1、N10),求矩阵 C(=AB)。例如:输入:N,M1,M=

29、4 3 4 A=1 2 3 34 5 提示:所谓矩阵相乘(如AB=C),是指45 6 Cij=(AikBkj)(i=1 N,j=1 M1,k=1M)51 2 B=1 6 4 2 例如:2 3 4 1 C11=A11B11+A12B21+A13B311 5 7 3 =11+22+3(1)输出:C=2 27 33 5 =2 6 55 63 5 C42=A41B12+A42B22+A43B32 8 69 78 5 =56+(1)3+(2)5 5 17 2 15 =17 解该题主要考查矩阵的表示及其运算。矩阵(NM1)与矩阵(M1M)相乘得矩阵(),其解法如下:i=1,重复做 j=1M,重复做 (1)

30、cij=0;(2)k=1 M1,重复做Cij=Cij+Aik*Bkj;(3)输出ij程序 program JiZheng;var i,j,k,N,M1,M:integer;A,B,C:array 1.10,1.10 of integer;Begin write(N,M1,M=);readln(N,M1,M);if(N=1)and(N=1)and(M1=1)and(M1)and(N=100)then begin write(Enter,N,numbers:);for i:=1 to N do begin read(Ai);输入 Ai if(Ai9)then Ai的值在 0 与 9 之间 begi

31、n writeln(Input error!);halt;end;end;for i:=1 to N-1 do BAi,Ai+1:=BAi,Ai+1+1;相邻数字对BAi,Ai+1值加 1 fd:=true;writeln(Result:);for i:=1 to N-1 do if(BAi,Ai+10)and(BAi+1,Ai0)then begin write(,Ai,Ai+1,)=,BAi,Ai+1,);if Ai+1=Ai then writeln 相邻数字相同,如(2,2)else writeln(,Ai+1,Ai,)=,BAi+1,Ai);BAi+1,Ai:=0;fd:=false

32、;end;if fd then writeln(Not found!);end else writeln(Input N error!);end.4、蛇形矩阵:生成一个按蛇形方式排列自然数1,2,3,4,5,,,N2的(1N 10)阶方阵。例如:输入:N=4 N=7 输出:1 3 4 10 1 3 4 10 11 21 22 2 5 9 11 2 5 9 12 20 23 34 6 8 12 15 6 8 13 19 24 33 35 7 13 14 16 7 14 18 25 32 36 43 15 17 26 31 37 42 44 16 27 30 38 41 45 48 28 29 3

33、9 40 46 47 49 解本题考查重点是矩阵的表示及上下标运算,旨在培养观察和分析思维能力。例如,当N=7 时,把 1,2,3,,,49 逐一填入数组 A中,搜索填数的方向如右图示:从图中,我们可以看出:对每个数字m(1,2,,,N*N)来说,可能按以下四种搜索方向之一填数:d=2(右上)m d=3(向右)d=4 (左下)d=1(向下)按照图 10-1 的搜索方向填数时,先要把当前数字m填入数组Ai,j中,接下来就是要确定下一次的填数的坐标及其搜索方向(即d=?)。现分析如下:第一种情形(d=1,如 m=2,7,15;35,44):(i,j)d=1 d=2(当 j=1)(i+1,j)d=4

34、(当 j=N)第二种情形(d=2,如 m=2,10,21;或 34,43,48;或 7,8,9,16,17,18,19等):d=2(当 i1 且 jN)(i-1,j)d=3(当 i=1)d=2d=1(当 j=N)(i,j)第三种情形(d=3,如 m=29,40,47;或 4,11,22):d=3 d=2(当 i=N)(i,j)(i,j+1)d=4(当 j=N)第四种情形(d=4,如 m=28,39,46;或 6,15;或 5,12,13,14等):(i,j)d=4(i+1,j)d=3(当 i=1)d=4(当 i=N 且 j1)程序 Program she;const max=10;var d,

35、i,j,m,N:integer;A:array 1.10,1.10 of integer;begin write(N=);readln(N);if(N=1)and(N=1)and(NN*N;writeln(OUTPUT:);for i:=1 to N do begin for j:=1 to N do write(Ai,j:4);输出填数 writeln;end;end else writeln(Input N error!);end.5、编码问题(95 年全国分区联赛题):设有一个数组A:array 0.N-1 of integer;存放的元素为 0 N-1(1Nn-1)then 数组 A中

36、有否相等 begin writeln(Input error!);halt;end;for i:=0 to n-1 do Bi:=0;编码数组 B初始值为0 for i:=1 to n-1 do for j:=0 to i-1 do if AiAj then Bi:=Bi+1;求数组编码 for i:=0 to n-1 do write(Bi:5);writeln;end;2:begin write(N=);readln(n);write(B=);for i:=0 to n-1 do read(Bi);readln;读编码数组B for i:=0 to n-1 do Pi:=i;建立取数数列P

37、 for i:=n-1 downto 0 do 由编码数组B逆向求原数组A begin Ai:=PBi;Ai为数组 P中第 Bi号元素 for j:=Bi to i-1 do Pj:=Pj+1;从 P数组中删去PBi end;write(A=);for i:=0 to n-1 do write(Ai:5);writeln;输出数组A end;end;end.第二章算法应用一、穷举搜索法穷举搜索法是穷举所有可能情形,并从中找出符合要求的解。穷举所有可能情形,最直观的是联系循环的算法。例 找出 n 个自然数(1,2,3,n)中 r 个数的组合。例如,当n=,r=3 时,所有组合为:total=10

38、 组合的总数 解 n个数中 r 的组合,其中每r 个数中,数不能相同。另外,任何两组组合的数,所包含的数也不应相同。例如,、与、。为此,约定前一个数应大于后一个数。将上述两条不允许为条件,当r=3 时,可用三重循环进行搜索。程序 Program zuhe11;const n=5;var i,j,k,t:integer;begin t:=0;for i:=n downto 1 do for j:=n downto 1 do for k:=n downto 1 do if(ij)and(ik)and(ij)and(jk)then begin t:=t+1;writeln(i:3,j:3,k:3);

39、end;writeln(total=,t);end.或者 Program zuhe12;const n=5;r=3;var i,j,k,t:integer;begin t:=0;for i:=n downto r do for j:=i-1 downto r-1 do for k:=j-1 downto 1 do begin t:=t+1;writeln(i:3,j:3,k:3);end;writeln(total=,t);end.这两个程序,前者穷举了所有可能情形,从中选出符合条件的解,而后者比较简洁。但是这两个程序都有一个问题,当r 变化时,循环重数改变,这就影响了这一问题的解,即没有一般

40、性。但是,很多情况下穷举搜索法还是常用的。二、递归法递归法也是常用的方法。例仍以前节例题为例,找n 个数的 r 个数的组合。要求:输入:n,r=5 3 输出:total=10 组合的总数 解 分析所提示的10 组数。首先固定第一位数(如),其后是在另个数中再“组合”个数。这就将“个数中个数的组合”推到了“个数中个数的组合”上去了。第一位数可以是 n r(如 3),n 个数中 r 个数组合递推到n-1 个数中 r-1 个数有组合,这是一个递归的算法。即:Procedure comb(n,r:integer);var i:integer;begin for i:=n downto r do beg

41、in 固定 i 的输出位置 comb(i-1,r-1);原过程递推到i-1个数的 r-1 个数组合 end;end;再考虑打印输出格式。程序 Program zuhe2;var k,n,r:integer;Produrce comb(n,r:integer);var i,temp:integer;begin for i:=n downto r do if (in)and(kr)then k为过程外定义的 begin for temp:=1 to (k-r)*3 do write();确定 i 的输出位置 end;write(i:3);if i1 then comb(i-1,r-1);递推到下一

42、情形 else writeln;end;Begin main write(n,r=);readln(n,r);if rn then begin writeln(Input n,r error!);halt;end;comb(n,r);调用递归过程 End;三、回溯法回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。例 再以前例说明,找n 个数中 r 个数的组合。解 将自然数排列在数组A中:A1 A2 A3 5 4 3 5 4 2,3 2

43、排数时从A1 A2 A3,后一个至少比前一个数小,并且应满足ri+Arir。若 ri+Arir 就要回溯,该关系就是回溯条件。为直观起见,当输出一组组合数后,若最后一位为,也应作一次回溯(若不回,便由上述回溯条件处理)。程序program zuhe3;type tp=array1.100 of integer;var n,r:integer;procedure comb2(n,r:integer;a:tp);var i,ri:integer;begin ri:=1;a1:=n;repeat if rir then 没有搜索到底 if ri+arir then 是否回溯 begin ari+1:

44、=ari-1;ri:=ri+1;end else begin ri:=ri-1;ari:=ari-1;end;回溯 else begin for j:=1 to r do write(aj:3);writeln;输出组合数 if ar=1 then 是否回溯 begin ri:=ri-1;ari:=ari-1;end;回溯 else ari:=ari-1;递推到下一个数 end;until a1r-1;end;begin MAIN write(n,r=);readln(n,r);if rn then begin writeln(Input n,r error!);halt;end comb2(

45、n,r);end.第三章综合题解综合测试题(一)1、寻找数:求所有这样的三位数,这些三位数等于它各位数字的立方和。例如,153135333。解 穷尽三位数,用一个循环语句。其数码可用“模取”运算MOD 完成。程序 PROGRAM lifang;uses crt;var i,a,b,c:integer;begin clrscr;for i:=100 to 999 do begin c:=i mod 10;取个位数 b:=(i div 10)mod 10;取十位数 a:=i div 100;取百位数 if i=a*a*a+b*b*b+c*c*c then writeln(i:6);end;end.

46、、最小自然数:求具有下列两个性质的最小自然数n:()n 的个位数是;()若将 n 的个位数移到其余各位数字之前,所得的新数是n 的倍。解 仍用穷举法寻找,当找到一个符合条件者便停止。“找到便停止”的重复,宜采用 repeatuntil循环。由于不知道n 是几位数,个位数移到前面去应借助一个指定位数的数。设为e。程序 program minnum;var n,e:integer;begin e:=1;n:=1;repeat e:=10*e;repeat n:=n+1;until not(n=e)or(10*n+6)*4=(6*e+n);until(10*n+6)*46*e+n);writeln(

47、10*n+6);end.、找素数:寻找 160 以内的素数,它的倒序数(如123 的倒序数为321)、数码和、数码积不是素数便是。解 倒序数、数码和、数码积都需对原数分解,分解后再查它们是否符合条件。程序 program sushu;uses crt;var i,j,n,s,p,f:integer;function cond(k:integer):boolean;var j:integer;b:boolean;begin b:=true;为 1 时表示 k 为素数 if k1 then for j:=2 to k-1 do if k mod j=0 then b:=false;if k=0 t

48、hen cond:=false else cond:=b;end;begin MIAN clrscr;for i:=2 to 160 do if cond(i)then begin j:=i;n:=0;s:=0;p:=1;while j0 do begin f:=j mod 10;j:=j div 10;n:=n*10+f;计算倒序数 s:=s+f;计算数码和 p:=p*f;计算数码积 end;if(cond(n)and(cond(s)and(cond(p)then write(i:5);end;writeln;readln end.、完全平方数:寻找具有完全平方数,且不超过位数码的回文数。所

49、谓回文数是指这样的数,它的各位数码是左右对称的。例如121、676、94249 等。解 判断一个数是否回文数,可以将其转化成字符判断。也可以分解数,所谓分解就是将数的后半段倒置后再与前半段比较。这里采用分解的方法,其函数为symm。程序 program wcpfs;uses crt;var i:longint;s:longint;function symm(n:longint):boolean;var i,j,k:longint;m:longint;begin i:=n;j:=1;计算 n 的位数 repeat j:=j+1;i:=i div 10;until(i=0);k:=j div 2;

50、m:=0;for i:=1 to k do 分解前后两位数 begin m:=m*10+(n mod 10);n:=n div 10;end;if j mod 2=1 then n 是奇数位,中间位不要 n:=n div 10;symm:=(m=n);end;begin MAIN clrscr;for i:=11 to round(sqrt(999999999)do begin if symm(i*i)then writeln(i*i);end;end.、成等差的素数:寻找个成等差级数且小于160 的素数。解 设级数为:n,n-d,n-2d,n-3d,n-4d,n-5d。若这个数全为素数,则为

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 实施方案

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com