2003B

五. 完善程序(共2题,第1题每空3分;第2题每空2分。共计28分)blog.163.com/yyyhhhffflove@126/
1. 翻硬币

题目描述:
    一摞硬币共有m枚,每一枚都是正面朝上。取下最上面的一枚硬币,将它翻面后放回原处。然后取下最上面的2枚硬币,将他们一起翻面后放回原处。在取3枚,取4枚……直至m枚。然后在从这摞硬币最上面的一枚开始,重复刚才的做法。这样一直做下去,直到这摞硬币中每一枚又是正面朝上为止。例如,m为1时,翻两次即可。


输    入:仅有的一个数字是这摞硬币的枚数m ,0< m <1000。
输    出:为了使这摞硬币中的每一枚都是朝正面朝上所必须翻的次数。
输入样例:30
输出样例:899

程    序:
    program Program1;
    var   m:integer;
    function solve(m: integer):integer;
       var i,t,d: integer;
           flag: Boolean;
       begin
         if (m = 1) then
            solve :=       (1)       
         else begin
                d := 2*m+1;     t := 2;     i := 1;    flag := False;
                repeat
                  if (t = 1) then
                    begin
                      solve :=       (2)       ;    flag := True;
                    end
                  else if (       (3)        ) then
                         begin
                           solve := i*m-1;     flag := True;
                         end
                       else
                         t :=      (4)       ;
                  i:=i+1;
                until flag;
              end
       end;
    begin
      read(m); if ((     (5)     ) and (m<1000)) then
         writeln(      (6)      );
    end.

2. OIM地形

题目描述:
二维离散世界有一种地形叫OIM(OI Mountain)。这种山的坡度只能上升('/')或下降('\'),而且两边的山脚都与地平线等高,山上所有地方都不低于地平线.例如:
/\                    /\
/ \/\ 是一座OIM;而 /   \    不是。
                            \/
这个世界的地理学家们为了方便纪录,给OIM所有可能的形状用正整数编好号,而且每个正整数恰好对应一种山形。他们规定,若两座山的宽度不同,则较宽的编号较大;若宽度相同,则比较从左边开始第1个坡度不同的地方,坡度上升的编号较大。以下三座OIM的编号有小到大递增:

/\      /\        /\ /\
/ \/\ / \/\/\ / \/ \
。显然/\的编号为1。但是地理学家在整理纪录是发觉,查找编号与山形的对应关系不是很方便。他们希望能快速地从编号得到山的形状。你自告奋勇答应他们写一个程序,输入编号,能马上输出山形。

输    入:一个编号(编号大小不超过600,000,000),
输    出:输入编号所对应的山形,1座山所占行数恰为它的高度,即山顶上不能有多余空行。

输入样例:15

输出样例:   /\ /\
            / \/ \

程    序:
     program Program2;
     const
       L:integer =19;    SZ: integer =50;
       UP: char = '/';   DN: char = '\';
     Var
       i,nth,x,y,h,e,f:integer;
       m: array[0..1,0..38,0..19] of integer;
       pic: array[0..49,0..49] of char;
    
procedure init;
       var k,s,a,b,c: integer;
       begin
         for a:=0 to 1 do
           for b:=0 to 2*L do
             for c:=0 to L do
               m[a,b,c]:=0;  

         m[0,0,0]:=1;
         for k:=0 to 2*L-1 do
         begin
           for s:=1 to L do
           begin
             m[0,k+1,s] := m[0,k,s+1] + m[1,k,s+1];
             m[1,k+1,s]:=      (1)      ;
           end;
             m[0,k+1,0] :=m[0,k,1]+m[1,k,1];
          end;
       end;
      
       procedure draw(k,s,nth:integer);
       begin
         if (k=0) then exit;
         if ((nth-m[1,k,s])>=0) then
           begin
             nth:=nth-m[1,k,s];
             if (y>h) then       (2)       ;
             pic[y,x]:=UP; y:=y+1; x:=x+1; draw(      (3)      );
           end
           else begin
                y:=y - 1;   pic[y,x]:=DN;     x:=x+1;   draw(k-1,s-1,nth);
                end;
       end;
            
     begin
       init;
       read(nth);
       for e:=0 to SZ-1 do
         for f:=0 to SZ-1 do
           pic[e,f]:= ' ';
       x:=0;
       y:=0
       h:=0;
       i:=0;
    
      while ((nth-m[0,2*i,0])>=0) do
      begin
        nth:= nth-m[0,2*i,0];
               (4)        ;
      end;

      draw(          (5)           );
      for i:=h downto x-1 do
      begin
        for e:=0 to x-1 do
        write(pic[i,e]);
        writeln(' ');
      end;
     end.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值