简单PASCAL问题

来源:百度知道 编辑:UC知道 时间:2024/05/29 03:42:14
约瑟夫问题改版,急需高手帮忙
一个由1到n的数列,第一个删除数1,然后每隔m个数删除一个数,如果要求最后删除的数是2,给出n,求最小的m

用FREE PASCAL编一个程序
Time limit: 10 Seconds Memory limit: 32768K
最近大家可能都感受到由于计生工作没有做好给网络带来的巨大压力,在上网高峰,响应速度将会便得非常非常
地慢。为了控制网络流量,网管们采取封IP这种极端手段,即在网络负荷过重的时候,逐个封掉一些楼的IP。校园的
N栋楼被命名为1..N,比如男生A栋为一号楼,而男生B栋为二号楼。网管利用一个随意确定的选择子M选择封IP的次序。
毫无疑问,第一个被封IP的是一号楼,而下一个被封的就是前一栋被封的楼后面第M各还每被封IP的楼。假如M=5,全校
有17栋楼,则被封IP的次序是
[1,6,11,16,5,12,2,9,17,10,4,15,14,3,8,13,7]
这大概是一种最公平的办法。但是后门毕竟还是可以走的:),我们最优秀的程序员(就是网管自己啦)住在男生B栋,就是
2号楼,他当然不希望连自己的IP都被封掉。所以他希望能有一个选择子M,能在上面的规则上,让2号楼最后被封IP,
网管用报告一顿麦当当的代价请你写一个程序来选择M

输入:
包含多个测试数据,每个测试数据一行,为一个代表学校有多少栋楼的整数N,输入以一个整数0结束
( 3 <= n < 150)

输出:
输出满足上面要求的最小整数M,每个输出占一行

program yuesefu;
var a:array[1..2000] of boolean;
i,k,m,n,q,total,totol:integer;
bool:boolean;
begin
writeln('how many counts');
readln(total);
a[1]:=false;
writeln('input the last count');
readln(m);
i:=0;
repeat
for k:=2 to total do a[k]:=true;
inc(i); k:=0; totol:=total-1; bool:=false;
repeat
repeat
inc(k);
if k>total then k:=1;
if a[k] then inc(q);
until q=i;
q:=0;
a[k]:=false;
dec(totol);
until totol=1;
for n:=2 to total do if a[n] then k:=n;
if k=m then bool:=true;
until bool;
writeln(i);
readln;
end.

介绍一下思想:
i代表要求的数,让它每次加一直到i符合条件;
total代表总数
totol代表当删掉total-1个数时即可结束循环

还有不懂的就补充一下问题,我再解释。

program panhan;
var
a:array[1..8]of boolean;
k,x,m,i,t,n:in