一圈人围坐在一起。一个人开始从1喊数,第二个人喊2...遇到7的倍数和包含7的数字,就将该人清除出去,并反向循环。
   要求做一个函数,迅速计算出给定人数后,那个人会坚持到最后.

解决方案 »

  1.   

    老问题用一个Boolean数组标记某人是否出去就行了
      

  2.   

    以下是pascal的,过会儿给basic的。题目描述:
    原始的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 program2;
    var
    i, k, m, start: longint;
    find: boolean;
    function check(remain: integer): boolean;
    var result: integer;
    begin
    result:=(  start+m-1  ) mod remain;
    if(  result>=k  )then begin
    start := result; check := true;
    end
    else check := false;
    end;
    begin
    find := false;
    read(k);
    m := k;
    while (  not find  ) do begin
    find := true; start := 0;
    for i := 0 to k-1 do
    if( not check(  2*k-i  )) then begin
    find := false; break;
    end;
    inc(m);
    end;
    writeln(  m-1  );
    end.