改一下这个PASCAL程序

改一下这个PASCAL程序,第1张

你的程序错误比较多。

主要的错误:输入的数据长度并不一定小于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.


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/11264718.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-14
下一篇2023-05-14

发表评论

登录后才能评论

评论列表(0条)

    保存