不是VIP会员,不能显示答案

题目解答

题目:
翻硬币
  题目描述:
  一摞硬币共有m枚,每一枚都是正面朝上。取下最上面的一枚硬币,将它翻面后放回原处。然后取下最上面的2枚硬币,将他们一起翻面后再放回原处。再取3枚,取4枚……直至m枚。然后再从这摞硬币最上面的一枚开始,重复刚才的做法。这样一直做下去,直到这摞硬币中的每一枚又都是正面朝上为止。例如,m为1时,翻两次即可。
  输入:仅有的一个数字是这摞硬币的枚数m,0<m<1000。
  输出:为了使这摞硬币中的每一枚又都是正面朝上所必需翻的次数。
  输入样例:30
  输出样例:899
  程 序:
program Programl;
var m:integer;
function solve (m:integer) : integer;
 var i,t,d:integer;
   flag :boolean;
 begin
  if (m = 1) then
    solve :=  2 
  else begin
     d := 2*m+1;t :=2;I :=1;flag :=False;
     repeat
      if (t=1) then
       begin
        solve:= i*m ; flag:=True; 
       end
      else if ( t=2*m ) then
          begin
           solve:= I * m-1;flag :=True
          end
         else
          t := (t*2) mod d ;
      I := i+1;
     until flag;
    end
  end;
 begin
  read (m); if (( m>0 ) and (m<1000)) then
    writeln ( solve(m) );
 end.
考点:
分析:
解答:
评论:
老师: