切换到宽版
  • 5335阅读
  • 3回复

翻硬币的题目 [复制链接]

上一主题 下一主题
离线雨⊙霏
 
只看楼主 正序阅读 0 发表于: 2007-10-05
  题目描述:
  一摞硬币共有m枚,每一枚都是正面朝上。取下最上面的一枚硬币,将它翻面后放回原处。然后取下最上面的2枚硬币,将他们一起翻面后再放回原处。再取3枚,取4枚……直至m枚。然后再从这摞硬币最上面的一枚开始,重复刚才的做法。这样一直做下去,直到这摞硬币中的每一枚又都是正面朝上为止。例如,m为1时,翻两次即可。m为2时,翻3次即可;m为3时,翻9次即可;m为4时,翻11次即可;m为5时,翻24次即可;…;m为30时,翻899次即可;…
  输 入:
  仅有的一个数字是这摞硬币的枚数m,0<m<1000。
  输 出:
  为了使这摞硬币中的每一枚又都是正面朝上所必需翻的次数。
  输入样例:
      30
  输出样例:
      899
  程 序:

program Programl;
    var m:integer;
     function solve (m:integer):integer;
     vat i,t,d:integer;
       flag:boolean;
     begin
      if (m=1)then
       so1ve:=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.
注意:翻硬币的过程中,被翻硬币的位置是在变化的,以4个硬币(全部正面)为例,第一次翻第一个,第一个在最上层;第二次翻两个,第一个就翻到第二层位置上去了,第二个到第一层上了;第三次翻三个,第三个翻到最上面了,第二个到了第三层......一直翻到第11次,全部硬币再次都为正面时,实际四个硬币的叠放次序变为第四个在最上层,第三个在第二层,第二个在第三层,第一个在最后一层。
[ 此贴被雨⊙霏在2007-10-05 22:48重新编辑 ]
离线lwx
只看该作者 3 发表于: 2007-10-26
此题我做了一下,发现大有来头.
我用的是排序的方法.先把所有的牛都放在一个数组中,用高度填数组,再建立一个数组,用来对应填高度的那个数组里每头牛的性别,再对高度数组由小到大排好序,性别数组也对应排序.最后一个双重循环依次求差并且将差累加.就求出了最后的高度和了.
离线lwx
只看该作者 2 发表于: 2007-10-26
此题我做了一下,发现大有来头.
我用的是排序的方法.先把所有的牛都放在一个数组中,用高度填数组,再建立一个数组,用来对应填高度的那个数组里每头牛的性别,再对高度数组由小到大排好序,性别数组也对应排序.最后一个双重循环依次求差并且将差累加.就求出了最后的高度和了.
离线雨⊙霏
只看该作者 1 发表于: 2007-10-05
这道题的算法的确很经典,不好理解啊
快速回复
限100 字节
 
上一个 下一个