综合测试题(二)
1、回文问题:递归法判断所输入的一行字符是否回文。这里所说的回文是指输入的一行字符,
以“-”字符为中心,其两边的字符是左右对称的。例如:
输入:ABCDE-EDCBA ↓
输出:It is symmetry. {输入一行字符是回文}
[解]设一行字符为M-W,对于M分解成由ch1表记的一个字符与一子串m;对w分解成一字符子串w和由ch2表记的一个字符,因此M-W这“回文”取决于:(1)m-w是回文;(2)ch1-ch2。即将原问题递推到m-w的解。递归终止条件是M与W(或m与w)长度为0。“回归”时,若m-w是回文且ch1=ch2,则M-W是回文;否则M-W就不是回文。程序使用递归过程pp。
[程序]
2、三齿轮问题:三个齿轮啮合。如图在齿轮箱里
三个齿轮互相衔接,某瞬间两对齿相遇,问各转
多少圈后,这两对齿同时重逢。如图示。
(说明:用a,b,c分别表示三个齿轮的齿数。)
[解]这一问题是最小公倍数问题。设三齿轮齿数分别是na、nb、nc,[na,nb,nc]为最小公倍数,相遇各齿轮所转的圈数为最小公倍数除以自己的齿数。
[程序]
{$I-}
1、回文问题:递归法判断所输入的一行字符是否回文。这里所说的回文是指输入的一行字符,
以“-”字符为中心,其两边的字符是左右对称的。例如:
输入:ABCDE-EDCBA ↓
输出:It is symmetry. {输入一行字符是回文}
[解]设一行字符为M-W,对于M分解成由ch1表记的一个字符与一子串m;对w分解成一字符子串w和由ch2表记的一个字符,因此M-W这“回文”取决于:(1)m-w是回文;(2)ch1-ch2。即将原问题递推到m-w的解。递归终止条件是M与W(或m与w)长度为0。“回归”时,若m-w是回文且ch1=ch2,则M-W是回文;否则M-W就不是回文。程序使用递归过程pp。
[程序]
CODE:
PROGRAM MW;
var ch:char;
function pp:boolean;
var ch1,ch2:char; bl:boolean;
begin read(ch1);
if ch1=';-'; then bl:=true
else begin
if pp then begin read(ch2);bl:=ch1=ch2;end
else bl:=false;
end;
pp:=bl;
end;
begin {MAIN}
write(';Input string:';);
if pp then begin read(ch);
if ord(ch)=13 then begin writeln;writeln(';It is symmetry.';);end
else begin writeln;writeln(';It is not symmetry.';);end;
end
else begin writeln;writeln(';It is not symmetry.';);end
end.
var ch:char;
function pp:boolean;
var ch1,ch2:char; bl:boolean;
begin read(ch1);
if ch1=';-'; then bl:=true
else begin
if pp then begin read(ch2);bl:=ch1=ch2;end
else bl:=false;
end;
pp:=bl;
end;
begin {MAIN}
write(';Input string:';);
if pp then begin read(ch);
if ord(ch)=13 then begin writeln;writeln(';It is symmetry.';);end
else begin writeln;writeln(';It is not symmetry.';);end;
end
else begin writeln;writeln(';It is not symmetry.';);end
end.
2、三齿轮问题:三个齿轮啮合。如图在齿轮箱里
三个齿轮互相衔接,某瞬间两对齿相遇,问各转
多少圈后,这两对齿同时重逢。如图示。
(说明:用a,b,c分别表示三个齿轮的齿数。)
[解]这一问题是最小公倍数问题。设三齿轮齿数分别是na、nb、nc,[na,nb,nc]为最小公倍数,相遇各齿轮所转的圈数为最小公倍数除以自己的齿数。
[程序]
{$I-}
CODE:
program cl;
var na,nb,nc,ma,mb,mc,l3:integer;
function gcd(x,y:integer):integer; { 求最大公约数函数 }
var r:integer;
begin
repeat r:=x mod y;x:=y;y:=r;until r=0;
gcd:=x;
end;
function lcm(x,y:integer):integer; { 求最小公倍数函数 }
begin lcm:=(x*y div gcd(x,y));
end;
function lcm3(a1,a2,a3:integer):integer; { 求三个数的最小公倍数函数 }
begin lcm3:=lcm(lcm(a1,a2),a3); end;
begin {
var na,nb,nc,ma,mb,mc,l3:integer;
function gcd(x,y:integer):integer; { 求最大公约数函数 }
var r:integer;
begin
repeat r:=x mod y;x:=y;y:=r;until r=0;
gcd:=x;
end;
function lcm(x,y:integer):integer; { 求最小公倍数函数 }
begin lcm:=(x*y div gcd(x,y));
end;
function lcm3(a1,a2,a3:integer):integer; { 求三个数的最小公倍数函数 }
begin lcm3:=lcm(lcm(a1,a2),a3); end;
begin {