2025年05月01日 星期四 农历 乙巳年(蛇)四月初四

信息学奥赛常考算法——不同进位制数的转换

发布人:钱翠萍    发布时间:2012-09-20 点击量:11228

将数字符号按序排列成数位,并遵照某种由低位到高位的进位方式计数表示数值的方法,称做进位计数制,简称进制。

掌握常见数字的不同进制表示。

熟悉二、八、十六进制的相互转换原理。

1.不同进制转换的基本算法是:

   ⑴ 十进制数(y)转换成任意进制数(n)的方法:将十进制数除以n进制反序求余。 

  ⑵将任意进制数转换成十进制数的方法:按展开;

   ⑶二进制、八进制、十六进制之间的转换方法:利用3位二进制表示一位八进制数,4位二进制数表示1位十六进制的数的方法

2.不同进制数的转换

   ⑴十进制整数转换成任意进制:除以进制数反向求余。

    设任意进制数x,十进制数y,则其算法模式是:

    重复做:

           t:=t+1;

           y mod x 的余数            a(t)

           y:=y div x

     直到y=0为止。

    输出则从最高位a(t)到第一位a(1)

    ⑵任意进制整数转换成十进制:按权展开

    设任意进制n数为x,按权展开的模式是:

    (1101)2 =1×23+ 1×22+ 1×21+ 1×20=13

 

【例题1】将十进制整数转换成任意进制的数

program shijinzhi;

  var a:array[1..50] of integer;

      n,x,y,i:integer;

  begin

    write('imput number x,y:');

    read(x,y);

    writeln;

    i:=0;

    repeat

      i:=i+1;

      a[i]:=y mod x;

      y:=y div x;

    until y=0;

    for n:=i downto 1 do

      write(a[n]);

    writeln;

  end.

 【例题2】将任意进制的整数转换成十进制数

program renyijinzhi;

  const m=20;

  var str1:string;str2:char;

      n,i,l,y,t:integer;

      x:longint;

      a:array[1..m] of integer;

  begin

    writeln('imput number x,n:');

    readln(x,n);

    str(x,str1);

    l:=length(str1);

    for i:=1 to l do

      begin

        str2:=str1[i];

        a[i]:=ord(str2)-ord('0');

      end;

    y:=1; t:=a[l];

    for i:=i-1 downto 1 do

      begin

        if a[i]>n then

          begin

            writeln('error');

            exit;

          end;

        y:=y*n;

        t:=t+a[i]*y;

      end;

    writeln(x,'---->',t);

  end.

用三进制数求解数学问题。

    用质量为1g3g9g27g81g的砝码称物体的质量,最大可称121g。如果砝码允许放在天平的两边,编程输出称不同物体时砝码应该怎样安排?例如m=14时,m+9+3+1=27m=27-9-3-1。即天平一端放m=14克的物体和9g3g1g的砝码,另一端放27g的砝码。

 【程序实现】

program sanjinzhi;

  var a,b,c,d,e,m:integer;

  begin

    for m:=1 to 121 do

      for a:=0 to 1 do

        for b:=-1 to 1 do

          for c:=-1 to 1 do

            for d:=-1 to 1 do

              for e:=-1 to 1 do

                if m=a*81+b*27+c*9+d*3+e then

                begin

                  writeln(m,’=’,a*81,’+(’,b*27,’)+(’,c*9, ’)+(’,d*3, ’)+(’,e,’)’);

                  readln;

                end;

  end.