.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.
 

解决方案 »

  1.   

    我连结构都没弄清楚。好象end不配对
      

  2.   

    解题:program progaram1;
    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.
      

  3.   

    对不起,格式没排好,应该是:program progaram1;
    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.
      

  4.   

    第三次排版。。program progaram1;
    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.
      

  5.   

    基本上可以根据题目的表述来参看程序中的变量,比如k就是输入的好人和坏人的人数,总人数=k*2
    程序定义的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循环即告退出,输出找到的结果。
      

  6.   

    上面的程序是PASCAL 语言?
      

  7.   

    是的,是PASCAL,但是比较老了,因为还在用函数名作为返回值,而不是用Result变量。
    在Delphi6.0里面选新建一个“Console Application”(Windows控制台程序)也会生成这种格式的代码。
      

  8.   

    用第三方Edit 或 WORD,都可以