.Joseph题目描述:
原始的Joseph问题的描述如下:有n个人围坐在一个圆桌周围,把这n个人依次编号为1,……,n。从编号是1 的人开始报数,数到m个人出列,然后从出列的下一个人重新开始报数,数到第m个人又出列,……,如此反复直到所有的人全部出列为止。比如当n=6,m=5的时候,出列的顺序依次是5,4,6,2,3,1。
现在的问题是:假设有k个好人和k个坏人。好人的编号是1到k,坏人的编号是k+1到2k。我们希望求出m的最小值,使得最先出列的k个人都是坏人。
输入:
仅有的一个数字是k (0<K<14)。
输出:
使得最先出列的k个人都是坏人的m的最小值。
输入样例:
4
输出样例:
30
程序:
program progaram1;
var
i,k,m,start:longint;
find:boolean;
function check(remain:integer):boolean;
var result:integer;
begin
result:=____(1)____ mod remain;
if ____(2)____ then begin
start:=result; check:=true;
end
else check:=false;
end;
begin
find:=false;
read(k);
m:=k;
while ____(3)____ do begin
find:=true; start;=0;
for i:=0 to k-1 do
if (not check(____(4)____)) then begin
find:=false; break;
end;
inc(m);
end;
writeln(____(5)____);
end.
原始的Joseph问题的描述如下:有n个人围坐在一个圆桌周围,把这n个人依次编号为1,……,n。从编号是1 的人开始报数,数到m个人出列,然后从出列的下一个人重新开始报数,数到第m个人又出列,……,如此反复直到所有的人全部出列为止。比如当n=6,m=5的时候,出列的顺序依次是5,4,6,2,3,1。
现在的问题是:假设有k个好人和k个坏人。好人的编号是1到k,坏人的编号是k+1到2k。我们希望求出m的最小值,使得最先出列的k个人都是坏人。
输入:
仅有的一个数字是k (0<K<14)。
输出:
使得最先出列的k个人都是坏人的m的最小值。
输入样例:
4
输出样例:
30
程序:
program progaram1;
var
i,k,m,start:longint;
find:boolean;
function check(remain:integer):boolean;
var result:integer;
begin
result:=____(1)____ mod remain;
if ____(2)____ then begin
start:=result; check:=true;
end
else check:=false;
end;
begin
find:=false;
read(k);
m:=k;
while ____(3)____ do begin
find:=true; start;=0;
for i:=0 to k-1 do
if (not check(____(4)____)) then begin
find:=false; break;
end;
inc(m);
end;
writeln(____(5)____);
end.
解决方案 »
- delphi报表数据分组,在学生成绩表中有10w条记录,如何按学号分组显示
- 我读取4个BYTE值。。然后如何转换成LONGWORD值
- 关于DBGRIDEH动态显示的问题???
- 那位高手知道这个题目呀?进来就有分!
- 请问一个:在ValueListEditor中加入时间TdateTimePicker,TCombobox.
- DBEdit9能自动计算假期时间
- datetimepicker显示数据库中一时间字段的时间
- 病毒问题
- 不在任务栏显示当前任务,怎么办?
- 凡是2000届大一计算机系的,来报到留QQ。
- 关于INDY 服务端(IdTCPServer) 以结构体接收数据,现在我想接收错误结构体的数据,请大家指点.
- delphi怎样用webbrowser打开程序中的窗口??
var
i,k,m,start: longint;
find: boolean;
function check(remain:integer): boolean;
var
result: integer;
begin
result:=____(1)_(start + m)___ mod remain;
if ____(2)_result > k-1___ then
begin
start:=result; check:=true;
end
else check:=false;
end;begin
find:=false;
read(k);
m:=k;
while ____(3)_not find___ do
begin
find:=true; start:=0;
for i:=0 to k-1 do
if (not check(____(4)_k*2-i___)) then
begin
find:=false; break;
end;
inc(m);
end;
writeln(____(5)_m___);
end.
var
i,k,m,start: longint;
find: boolean;
function check(remain:integer): boolean;
var
result: integer;
begin
result:=____(1)_(start + m)___ mod remain;
if ____(2)_result > k-1___ then
begin
start:=result; check:=true;
end
else check:=false;
end;begin
find:=false;
read(k);
m:=k;
while ____(3)_not find___ do
begin
find:=true; start:=0;
for i:=0 to k-1 do
if (not check(____(4)_k*2-i___)) then
begin
find:=false; break;
end;
inc(m);
end; // while
writeln(____(5)_m___);
end.
var
i,k,m,start: longint;
find: boolean;
function check(remain:integer): boolean;
var
result: integer;
begin
result:=____(1)_(start + m)___ mod remain;
if ____(2)_result > k-1___ then
begin
start:=result; check:=true;
end
else check:=false;
end;begin
find:=false;
read(k);
m:=k;
while ____(3)_not find___ do
begin
find:=true; start:=0;
for i:=0 to k-1 do
if (not check(____(4)_k*2-i___)) then
begin
find:=false; break;
end;
inc(m);
end; // while
writeln(____(5)_m___);
end.
程序定义的find变量是个布尔型,基本上根据它的意思就可以猜到是作为找到最终结果的标志,浏览代码后马上就可以确定由它来作为while循环的判别标志。
程序末尾的writeln()显然是输出结果,那基本上就可以确定填写的表达式和m有关。
程序的核心在于check函数,它决定了整个程序的解决思路,根据check函数的参数名remain基本可以猜到这是剩余人数,所以根据check外层的for循环是从i到k-1可以得出(4)的答案,总人数k*2减去i就是每次循环的剩余人数。当循环k次后(0 to k-1),剩余人数(k*2-i)正好减半,因为坏人全部出列了,只剩下好人,这个m也确定了,由于循环时check返回值始终为true,所以find为初始的true,while循环即告退出,输出找到的结果。
在Delphi6.0里面选新建一个“Console Application”(Windows控制台程序)也会生成这种格式的代码。