精华1780
威望224359
K币205432 元
注册时间2005-10-7
在线时间5529 小时
最后登录2019-3-21
荣誉会员
安宁的忧郁
 
- 精华
- 1780
- 威望
- 224359
- K币
- 205432 元
- 注册时间
- 2005-10-7

|
19. 以字符串形式由键盘输入两个高精度的8进制正整数,串长小于255,
以
第一个数为被除数,第二个数为除数,进行高精度除法运算,并显示按 8 进制
表
示的商和余数。
program lxw019;
const
str2:string[32]='000 001 010 011 100 101 110 111 ';
str8:string[32]='0 1 2 3 4 5 6 7 ';
var a1,a2: string;
flag2:boolean; i:integer;
function s8to2(s8:string):string;
var i,j:integer; s:string;
begin
s:='';
for i:=1 to length(s8) do
begin
j:=-3;
repeat j:=j+4 until str8[j]=s8;
s:=s+copy(str2,j,3)
end;
s8to2:=s
end;
PDF 文件以 "FinePrint pdfFactory Pro" 试用版创建 http://www.pdffactory.com
function s2to8(s2:string):string;
var i,j:integer; s,t: string;
begin
while (length(s2) mod 3)>0 do s2:='0'+s2; s:='';
for i:=1 to (length(s2) div 3) do
begin
t:=copy(s2,1,3); delete(s2,1,3);
j:=-3;
repeat j:=j+4 until copy(str2,j,3)=t;
s:=s+str8[j]
end;
s2to8:=s
end;
procedure minus(a,b:string; var c:string; var flag:boolean);
var i,i1,j,lb:integer;
begin
flag:=true; lb:=length(b);
while length(a)<lb do a:='0'+a;
while (length(a)>lb) and (a[1]='0') do delete(a,1,1);
if (a<b) and (length(a)=lb)
then begin flag:=false; exit end;
c:='';
PDF 文件以 "FinePrint pdfFactory Pro" 试用版创建 http://www.pdffactory.com
for i:=lb downto 1 do
begin
i1:=i;
if length(a)>lb then i1:=i+1;
if a[i1]=b then c:='0'+c
else if a[i1]>b then c:='1'+c
else begin
j:=i1;
repeat
a[j]:=succ(succ(a[j]));
a[j-1]:=pred(a[j-1]);
j:=j-1;
until a[j]='0';
c:='1'+c
end;
end;
while (c[1]='0') and (length(c)>1) do delete(c,1,1)
end;
procedure divid(a,b:string);
var c,d,e:string;
flag:boolean; lb:integer;
begin
PDF 文件以 "FinePrint pdfFactory Pro" 试用版创建 http://www.pdffactory.com
while (b[1]='0')and(length(b)>0) do delete(b,1,1);
lb:=length(b);
if lb=0 then begin
writeln('数据错: 除数为零 !');
exit
end;
d:=copy(a,1,lb-1); delete(a,1,lb-1); c:='';
if length(a)>0 then
repeat
d:=d+a[1]; delete (a,1,1);
minus(d,b,e,flag);
if not flag then c:=c+'0'
else begin c:=c+'1'; d:=e; end;
until length(a)=0;
if c='' then c:='0';
e:=s2to8(c);
while (e[1]='0') and (length(e)>1) do delete(e,1,1);
writeln(e);
e:=s2to8(d);
while (e[1]='0') and (length(e)>1) do delete(e,1,1);
writeln('..........',e);
end;
PDF 文件以 "FinePrint pdfFactory Pro" 试用版创建 http://www.pdffactory.com
begin{main}
repeat
flag2:=true;
writeln('输入被除数 (0..7, <=250 位):'); readln(a1);
for i:=1 to length(a1) do
if not(a1 in ['0'..'7']) then flag2:=false;
writeln('输入除数 (0..7, <=250 位):'); readln(a2);
for i:=1 to length(a2) do
if not(a2 in ['0'..'7']) then flag2:=false;
if not flag2 then writeln('数据错(只能使用数字 0-7), 重新输入 !')
until flag2;
writeln; writeln('计算结果:');
writeln(a1,' / ');
writeln(a2,' =');
a1:=s8to2(a1); a2:=s8to2(a2);
divid(a1,a2)
PDF 文件以 "FinePrint pdfFactory Pro" 试用版创建 http://www.pdffactory.com
20. (八数码问题) 8个编有数码1 ̄8的滑牌,能在3*3的井字格中滑动。
井
字格中有一格是空格,用0表示,因而空格周围的数码滑牌都可能滑到空格中去.
下图是数码滑牌在井字格中的两种状态:
┎─┬─┬─┒ ┏━┯━┯━┓
┃2 │8 │3 ┃ ┃1 │2 │3 ┃
┠─┼─┼─┨ ┠─┼─┼─┨
┃1 │6 │4 ┃ ----> ┃8 │0 │4 ┃
┠─┼─┼─┨ ┠─┼─┼─┨
┃7 │0 │5 ┃ ┃7 │6 │5 ┃
┗━┷━┷━┛ ┗━┷━┷━┛
初始状态 目标状态
以左图为初始状态,右图为目标状态,请找出从初始状态到目标状态的滑牌移步
序
列,具体要求:
(1)输入初始状态和目标状态的数据;
a、分别用两行输入上述两项数据:
b、对输入数据应有查错和示错功能;
(2)实现从初始状态到目标状态的转换(如不能实现,程序应输出不能实
现
的提示信息);
(3)输出结果,每移动一步都必须在屏幕上显示:
a、移动每一步时的序号,最后一步的序号即为移动总步数;
b、每一步移动后以3*3表格形式显示状态。
PDF 文件以 "FinePrint pdfFactory Pro" 试用版创建 http://www.pdffactory.com
(4)要求能使移动步数尽可能少;
program lxw020;
uses crt;
type a33=array [1..3,1..3] of byte;
a4=array [1..4] of shortint;
node=record
ch:a33;
si,sj,pnt,dep:byte;
end;
const goal:a33=((1,2,3),(8,0,4),(7,6,5));
start:a33=((2,8,3),(1,6,4),(7,0,5));
di:a4=(0,-1,0,1);
dj:a4=(-1,0,1,0);
var data: array [1..100] of node;
temp:node;
k,r,ni,nj,closed,open,depth:integer;
function check(k:integer):boolean;
begin
check:=false;
ni:=temp.si+di[k]; nj:=temp.sj+dj[k];
if(ni in[1..3])and(nj in[1..3]) then check:=true;
PDF 文件以 "FinePrint pdfFactory Pro" 试用版创建 http://www.pdffactory.com
if(ni=data[temp.pnt].si)and(nj=data[temp.pnt].sj)
then check:=false;
end;
function dupe:boolean;
var i,j,k: integer;
buf:boolean;
begin
buf:=false; i:=0;
repeat
inc(i); buf:=true;
for j:=1 to 3 do
for k:=1 to 3 do
if data.ch[j,k]<>data[open].ch[j,k]
then buf:=false;
until buf or (i>=open-1);
dupe:=buf;
end;
function goals:boolean;
var i,j:integer;
begin
goals:=true;
for i:=1 to 3 do
PDF 文件以 "FinePrint pdfFactory Pro" 试用版创建 http://www.pdffactory.com
for j:=1 to 3 do
if data[open].ch[i,j]<>goal[i,j]
then goals:=false;
end;
procedure print;
var buf: array [1..100] of integer;
i,j,k,n:integer;
begin
n:=1; i:=open; buf[1]:=i;
repeat
j:=data.pnt;
inc(n); buf[n]:=j; i:=j;
until i=0;
writeln('steps:',depth-1);
for i:=1 to 3 do
begin
for k:=n-1 downto 1 do
begin
for j:=1 to 3 do
write(data[buf[k]].ch[i,j]);
if i=2 then write('->') else write(' ');
end;
PDF 文件以 "FinePrint pdfFactory Pro" 试用版创建 http://www.pdffactory.com
writeln;
end;
readln; halt;
end;
begin{main}
closed:=0; open:=1;
with data[1] do
begin
ch:=start; si:=3; sj:=2;
pnt:=0; dep:=0;
end;
repeat
inc(closed); temp:=data[closed];
depth:=temp.dep;
for r:=1 to 4 do
if check(r) then
begin
inc(open);
data[open]:=temp;
with data[open] do
begin
ch[si,sj]:=ch[ni,nj];
PDF 文件以 "FinePrint pdfFactory Pro" 试用版创建 http://www.pdffactory.com
ch[ni,nj]:=0; si:=ni; sj:=nj;
pnt:=closed; dep:=depth+1;
end;
if dupe then dec(open)
else if goals then print;
end;
until closed>=open;
writeln('no solution!'); readln
end.
PDF 文件以 "FinePrint pdfFactory Pro" 试用版创建 http://www.pdffactory.com
21. 设有n根火柴,由人和计算机轮流从中取走若干根。每方每次最多取k根,
最少取1根 (k值不能超过总数的一半,也不能小于1)。试编写一程序使计算
机有较多的获胜机会。
program lxw021;
var x,y,N,p:integer;
begin
writeln('input n:p, 1<p<n');
readln(N,p);
Repeat
Repeat
writeln('Your move is:');
Readln(x);
until (x>=1) and (x<=p);
N:=N-x;
if N=0 then writeln('I win !! ');
if n>0 then
begin
y:=(N-1)mod(p+1);
if y=0 then y:=1;
N:=N-y;
writeln('x=',x,' y=',y,' Remains=',N);
if N=0 then writeln('** You beat me !!');
PDF 文件以 "FinePrint pdfFactory Pro" 试用版创建 http://www.pdffactory.com
end;
until N=0;
end.
PDF 文件以 "FinePrint pdfFactory Pro" 试用版创建 http://www.pdffactory.com
22.(取奇数游戏) 该游戏规则如下: 操作者先输入一个奇数 N(<200)表示N个石
子. 设计算机为 A 方,操作者为 B 方, 双方轮流取石子,每次取1-3个. 最后取
到石子总数为奇数的一方获胜. 编制程序使计算机有较多的获胜机会,
program lxw022;
uses crt;
t
ype
setab=set of 0..200;
var
evena,evenb,odda,oddb:setab;
i,j,n,na,nb,k,kz,r,t:integer;
ab,ll:char;
procedure init0(var n:integer);
begin
clrscr;
gotoxy(1,1);
writeln('***************************************');
writeln(' 取奇数游戏 规则如下: ');
writeln(' 1.操作者先输入一个奇数 N(<200).');
writeln(' 2.设计算机为 A 方,操作者为 B 方,双方轮流取数,每次取1-3个.');
writeln(' 3.最后取到奇数的一方为胜方. ');
writeln('***************************************');
n:=400;
PDF 文件以 "FinePrint pdfFactory Pro" 试用版创建 http://www.pdffactory.com
while not odd(n)or(n>200) do
begin
gotoxy(10,7);
writeln('输入一个奇数 N(<200):');
gotoxy(10,8); readln(n);
end;
end;
procedure prt1;
begin
gotoxy(1,17);
writeln(' 总计 计算机已取得 操作手已取得 剩余
');
gotoxy(50,19);
writeln(' ');
gotoxy(1,19);
writeln(' ',n,' ',na,' ',nb,
' ',r);
end;
procedure prt2(var ll:char);
begin
gotoxy(10,21);
if odd(na) then writeln('可惜, 你输了!')
PDF 文件以 "FinePrint pdfFactory Pro" 试用版创建 http://www.pdffactory.com
else writeln ('祝贺你的成功!');
gotoxy(10,22);
writeln('再玩一次吗 ? (Y/N)');
gotoxy(10,23); readln(ll);
end;
procedure aget(var r,t,na:integer);
var k,kz:integer;
begin
kz:=0; k:=0;
while (k<3)and(kz=0)and(k<r) do
begin
k:=k+1;
if (not odd(na+k))and(r-k in evena) then
begin kz:=1; t:=k end;
if (odd(na+k))and(r-k in odda) then
begin kz:=1; t:=k end;
end;
if kz=0 then t:=1;
gotoxy(50,14);
writeln(' 计算机这次取 ',t,' 个.');
na:=na+t; r:=r-t;
end;
PDF 文件以 "FinePrint pdfFactory Pro" 试用版创建 http://www.pdffactory.com
procedure bget(var r,t,nb,i:integer);
begin
t:=0;
while not(t in[1,2,3])or(t>r) do
begin
gotoxy(30,13); writeln(' ');
gotoxy(2,13);
writeln('第',i:2,' 轮: 输入你的选择 (1/2/3) 并且不得超过 ',r);
gotoxy(5,14); write(' ');
gotoxy(5,14); readln(t); gotoxy(20,14);
if not(t in[1,2,3])or(t>r)
then write('数据错! 请重新输入.')
else write(' ');
end;
nb:=nb+t; r:=r-t;
end;
begin{main}
ll:='y';
while (ll='Y')or(ll='y') do
begin{2}
init0(n);
r:=n;
PDF 文件以 "FinePrint pdfFactory Pro" 试用版创建 http://www.pdffactory.com
{ 1. 建立获胜策略集 EVENA,EVENB,ODDA,ODDB }
evena:=[4,5]; evenb:=[0,1,2,3];
odda:=[0,1]; oddb:=[2..5];
for i:=6 to n do
begin{3}
nb:=0;
if not odd(i) then nb:=1;
kz:=0; k:=0;
while (k<3)and(kz=0) do
begin
k:=k+1;
if odd(nb+k)and (i-k in odda) then kz:=1;
if (not odd(nb+k))and(i-k in evena) then kz:=1;
end;
if kz=0
then evena:=evena+
else evenb:=evenb+;
nb:=0;
if odd(i) then nb:=1;
kz:=0; k:=0;
while (k<3)and(kz=0) do
begin
PDF 文件以 "FinePrint pdfFactory Pro" 试用版创建 http://www.pdffactory.com
k:=k+1;
if odd(nb+k)and (i-k in odda) then kz:=1;
if (not odd(nb+k))and(i-k in evena) then kz:=1;
end;
if kz=0
then odda:=odda+
else oddb:=oddb+;
end;{3}
{ 2. 开始取数. }
na:=0; nb:=0; t:=0; ab:=' ';
while not (ab in ['a','b','A','B']) do
begin
gotoxy(10,9);
writeln('输入: "谁先开始 (A/B) ?" A: 计算机, B:操作手.');
gotoxy(10,10); readln(ab);
end;
i:=1;
if (ab='B')or(ab='b') then bget(r,t,nb,i);
repeat
if r>0 then
begin {5}
aget(r,t,na);
PDF 文件以 "FinePrint pdfFactory Pro" 试用版创建 http://www.pdffactory.com
prt1;
if r>0 then bget(r,t,nb,i);
i:=i+1;
end;{5}
until r=0;
gotoxy(3,16); writeln(' 最后结果:');
prt1; prt2(ll);
end{2}
end.{main}
PDF 文件以 "FinePrint pdfFactory Pro" 试用版创建 http://www.pdffactory.com
23. 求n个字符串的最长公共子串,n<=20,字符串长度不超过255。
例如:n=3,由键盘依次输入三个字符串为
What is local bus ?
Name some local buses.
local bus is a high speed I/O bus close to the processer.
则最长公共子串为"local bus"。
program lxw023;
l
abel 10;
var str20:array[1..20] of string;
str1,str2: string;
t,i,j,k,n,ki,kz,kn: integer;
find1,find2: boolean;
begin
writeln('输入字符串的个数 n:'); readln(n);
writeln('输入 ',n,' 个字符串:');
for i:=1 to n do readln(str20);
kz:=300;
for i:=1 to n do
if length(str20)<kz then
begin
kz:=length(str20);
ki:=i;
PDF 文件以 "FinePrint pdfFactory Pro" 试用版创建 http://www.pdffactory.com
end;
str1:=str20[ki];
t:=kz; find1:=false;
while(t>0) and (not find1) do
begin{2}
for i:=1 to kz-t+1 do
begin{3}
str2:=copy(str1,i,t); find2:=true;
j:=1;
while find2 and (j<=n) do
begin{4}
find2:=false;
kn:=length(str20[j]);
k:=1;
while not find2 and (k<=kn-t+1) do
if str2=copy(str20[j],k,t)
then find2:=true
else k:=k+1;
j:=j+1;
end;{4}
if find2 then
begin find1:=true; goto 10; end
PDF 文件以 "FinePrint pdfFactory Pro" 试用版创建 http://www.pdffactory.com
end;{3}
t:=t-1
end;{2}
10: writeln('最大公共子串是:');
writeln(str2); writeln('The length=',t)
end.
PDF 文件以 "FinePrint pdfFactory Pro" 试用版创建 http://www.pdffactory.com
动态规划的一个典型的例题。
卡车更新问题,(即设备更新问题)
【试题】 某人购置了一辆新卡车, 从事个体运输业务. 给定以下各有关数据:
R[t], t=1,2,...,k, 表示已使用过 t 年的卡车, 再工作一年所得的运费, 它 随 t
的增加而减少, k (k≤20) 年后卡车已无使用价值.
U[t], t=1,...,k, 表示已使用过 t 年的卡车, 再工作一年所需的维修费, 它 随 t
的增加而增加.
C[t], t=1,2,...,k, 表示已使用过 t 年的旧卡车, 卖掉旧车, 买进新车, 所 需的
净费用, 它随 t 的增加而增加. 以上各数据均为实型, 单位为"万元".
设某卡车已使用过 t 年,
1 如果继续使用, 则第 t+1 年回收额为 R[t]-U[t],
2 如果卖掉旧车,买进新车, 则 第 t+1 年回收额为 R[0]-U[0]-C[t] .
该运输户从某年初购车日起,计划工作 N (N<=20) 年, N 年后不论车的状态
如 何,不再工作. 为使这 N 年的总回收额最大, 应在哪些年更新旧车? 假定在
这 N 年内, 运输户每年只用一辆车, 而且以上各种费用均不改变.
输入: 用文件输入已知数据, 格式为:
第 1 行: N (运输户工作年限)
第 2 行: k (卡车最大使用年限, k≤20 )
第 3 行: R[0] R[1] ... R[k]
第 4 行: U[0] U[1] ... U[k]
第 5 行: C[0] C[1] ... C[k]
输出: 用文本文件按以下格式输出结果:
第 1 行: W ( N 年总回收额 )
第 2--N+1 行: 每行输出 3 个数据:
年序号 ( 从 1 到 N 按升序输出 );
是否更新 ( 当年如果更新,输出 1, 否则输出 0);
PDF 文件以 "FinePrint pdfFactory Pro" 试用版创建 http://www.pdffactory.com
当年回收额 ( N 年回收总额应等于 W ).
例: 设给定以下数据:
N=4, k=5,
i: 0 1 2 3 4 5
R: 8 7 6 5 4 2
U: 0.5 1 2 3 4 5
C: 0 2 3 5 8 10
则正确的输出应该是
24.5
1 0 7.5
2 1 5.5
3 1 5.5
4 0 6.0
【分析】这是动态规划的一个典型的例题.由题意可知,用过t 年的卡车,继续使用
一年的收益为d[t]=R[t]-U[t],更换新车后一年的收益为e[t]=R[0]-U[0]-C[t]. 我们
采用倒推分析的方法.F[j,t]表示已经使用了t 年的卡车, 在第j 年不论继续使用还
是更新,到第N年为止,可能得到的最大收益. 规定当j>N时, F[j,t]≡0. 如果在第j
年更新,则收益为p=e[t]+F[j+1,1]; 如果仍使用旧车,则收益为 q=d[t]+F[j+1,t+1].
这里,e[t]或d[t]为第j 年的收益, F[j+1,1]或F[j+1,t+1]为从第j+1 年到第N年在不
同条件下的最大收益.显然,F[j,t]=Max(p,q).这就是所需要的计算公式.
在下面的程序中,数组g[j,t]用于记录使用过t 年的车,在第j 年的选择方
案,g[j,t]=1 表示更换新车,g[j,t]=0 表示仍使用旧车.
【参考程序】
program tjcoi2_3; { Write By Li Xuewu }
type arr20=array[0..20] of real;
PDF 文件以 "FinePrint pdfFactory Pro" 试用版创建 http://www.pdffactory.com
var rr,uu,cc,d,e:arr20;
f:array [0..22,0..21] of real;
g:array [0..22,0..21] of integer;
i,j,k,k2,n,t:integer;
file1:string[20];
p,q:real;
text2,text3:text;
procedure init;
var i:integer;
begin
writeln('Input filename:');
readln(file1);
assign(text2,file1); reset(text2);
readln(text2,n); readln(text2,k);
for i:=0 to k do read(text2,rr); readln(text2);
for i:=0 to k do read(text2,uu); readln(text2);
for i:=0 to k do read(text2,cc); readln(text2);
close(text2);
for i:=0 to k do
begin d:=rr-uu; e:=d[0]-cc; end;
end;
procedure result3;
PDF 文件以 "FinePrint pdfFactory Pro" 试用版创建 http://www.pdffactory.com
var i:integer;
begin
writeln('enter filename for output:');
readln(file1);
assign(text3,file1); rewrite(text3);
writeln(text3,f[1,1]:8:3);
writeln(text3,' 1 0', e[0]:8:2); t:=1;
for i:=2 to n do
if g[i,t]=1 then
begin writeln(text3,i:2,' 1',e[t]:8:2); t:=1 end
else
begin writeln(text3,i:2,' 0',d[t]:8:2); t:=t+1; end ;
writeln(f[1,1]:8:3);
writeln(' 1 0',e[0]:8:2); t:=1;
for i:=2 to n do
if g[i,t]=1 then
begin writeln(i:2,' 1',e[t]:8:2); t:=1 end
else
begin writeln(i:2,' 0',d[t]:8:2); t:=t+1; end ;
close(text3);
end;
begin {main}
PDF 文件以 "FinePrint pdfFactory Pro" 试用版创建 http://www.pdffactory.com
init;
for i:=0 to n do
for j:=0 to k do g[i,j]:=1;
for i:=0 to k do f[n+1,i]:=0;
for i:=1 to n+1 do f[i,k+1]:=-100;
for j:=n downto 2 do
begin
k2:=k;
if j<k then k2:=j-1;
for t:=1 to k2 do
begin
p:=e[t]+f[j+1,1]; q:=d[t]+f[j+1,t+1];
f[j,t]:=p; g[j,t]:=1;
if q>p then
begin g[j,t]:=0; f[j,t]:=q; end;
end;
end;
f[1,1]:=d[0]+f[2,1];
result3;
end.
PDF 文件以 "FinePrint pdfFactory Pro" 试用版创建 http://www.pdffactory.com |
|