古代一个王国的公主爱上了花匠。公主要出嫁按传统要用抛绣球的方式选择附马。花匠就给公主献了个对策。婚日来临,人群拥挤,主持人叫求婚者排成一行,花匠在队列外数了数,共有101个人,于是他找了个适当的位置也站在了队伍中。主持人喊1、2,1、2地报数,报单数的退出场外;余下的人靠拢又成一行,再重新1、2,1、2地报数,报单数的退出场外;如此下去最后只剩一下,公主便嫁给谁。当然,最后剩下的是花匠。请问花匠站在原队伍中的哪一个位置?
算法分析:求婚的总人数是102人;第一遍报数后,退出场的是1,3,5,7...共51人,也就是2的0次方分别乘以1,3,5...;
第二遍报数后,退出场的是原队伍中的2,6,10.. 即2的1次方分别乘1,3,5;
第三遍报数后,退出场的就是2的2次方分别乘以1,3,5.. 所以,源程序ex11_1.prg如下:
SET TALK OFF
CLEA
CLEA ALL
rs = 102
DIME a(rs)
FOR i = 1 TO rs
a(i) = i
ENDFOR
STOR 0 TO ip,N
DO WHILE .T.
k = 0
FOR i = 1 TO rs
IF a(i) = 0
LOOP
ENDIF
k = k + 1
IF k = INT(k / 2 ) * 2
LOOP
ENDIF
m = a(i)
a(i) = 0
N = N + 1
ENDFOR
IF N = rs
? " 共报了 " + STR(ip) + ;
" 次数,花匠站在原队伍第 " + ;
STR(m) + " 个位置 "
RETU
ENDIF
ip = ip + 1
ENDDO
RETU