
主要的错误:输入的数据长度并不一定小于255。
以下程序仅供参考:
Var
a,b,c,d:array[0..100000]of
integer//a存11分制下的W,b存11分制下的L,c存21分制下的W,d存21分制下的L
wle:char
i,j,n,m:integer//n表示11分制下的局数,m表示21分制下的局数
Begin
while
i=0
do
Begin
j:=j+1
read(wle)
if
wle='W'
Then
Begin
a[n]:=a[n]+1c[m]:=c[m]+1End//计分
if
wle='L'
Then
Begin
b[n]:=b[n]+1d[m]:=d[m]+1End//计分
if
wle='E'
Then
Begin
i:=1readlnEnd//判断完结
if
j=20
Then
Begin
readlnj:=0End//换行
if
((a[n]>=11)or(b[n]>=11))and(abs(a[n]-b[n])>1)Then
n:=n+1//判断下一局
if
((c[m]>=21)or(d[m]>=21))and(abs(c[m]-d[m])>1)Then
m:=m+1//判断下一局
End
For
i:=0
to
n
do
writeln(a[i],':',b[i])
writeln
For
i:=0
to
m
do
writeln(c[i],':',d[i])
End.
else前面不能有分号,我删除了之后就好了,正确的因该是:program unhappy
var
a,b,c:array[1..7] of integer
max,i:integer
begin
assign(input,'unhappy.in')
assign(output,'unhappy.out')
reset(input)
rewrite(output)
for i:=1 to 7 do
begin
read(a[i],b[i])
write(a[i],b[i])
end
for i:=1 to 7 do
begin
if a[i]+b[i]>8
then begin
c[i]:=a[i]+b[i]
write(c[i])
end
else begin
if a[i]+b[i]<=0 then
c[i]:=0
write(c[i])
end
end
max:=0
for i:=1 to 7 do
begin
if (a[i]+b[i]>max) and (a[i]+b[i]<>0) then
max:=a[i]+b[i]
write(max)
break
end
for i:=1 to 7 do
begin
if c[i]=max then
write(i)
end
end.
这个程序等价于下面这个(我把r:=xexit都改成了exit(x)因为这两个等价,而且后者更简洁一点)从递归程序中(详见下面的递归)可以看出
r(n)的表达式应该是
r(n)=n,n<=5
r(n)=i,n>5且存在r(n-i)<0,i=1,2,3,4,5
r(n)=-1,n>5且任意r(n-i)>0,i=1,2,3,4,5
也就是n>5时,只要前面的连续5个r的值都是正的,那么r(n)=-1
不然的话r(n)就是n和前面离他最近的那个令r为负的n0之差,即r(n)=n-n0,r(n0)<0
而这个差一定是正数而且是1~5,否则说明前面的连续5个r的值都是正的,那么r(n)就应当是-1
所以可以这样看出r的递推关系
r(1)=1
r(2)=2
r(3)=3
r(4)=4
r(5)=5
r(6)=-1
在这之后r(7)=7-6=1,因为r(7-1)<0
所以以此类推
r(8)=2
...
r(11)=5
r(12)=-1
...
所以由此看出规律r(n)是以6为周期的,即r(n)=r((n-1) mod 6+1)
所以r(16)=r((16-1) mod 6 +1)=r(4)=4
下面的递归就是体现了上面的递推过程
就拿16为例,递归程序做了下面的事情
r(16)
1、16>5,继续
2、计算r(15)~r(11)
3、发现r(12)=-1
4、返回4
const
num=5//这个地方应该是=而不是:=
var n:integer
function r(n:integer):integer
var
i:integer
begin
if n<=num then//如果n小于等于5,那么返回n(这里n不可能小于0,除非一开始传进去负值)
exit(n)//正数
for i:=1 to num do
if r(n-i)<0 then//如果r(n-i)小于0,i=1,2,3,4,5
exit(i)//返回i,这里i也不会是负数
exit(-1)//如果上面都没退出,说明n大于5并且r(n-1)~r(n-5)都大于零,所以r为负时只可能为-1
end
begin
readln(n)
writeln(r(n))
end.
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)