Nickolay.info. Алгоритмы. Перевод целого числа из десятичной и в десятичную систему счисления

Перевести произвольное целое число из деятичной системы счисления в систему счисления с любым другим основанием. Перевести число произвольной из системы счисления в десятичную.

В листинге ниже показаны 2 соответствующих функции и их тест. Функции работают только с целыми положительными числами, но в этом плане их нетрудно расширить. Диапазон поддерживаемых оснований систем счисления ограничен значениями от 2 до 36 включительно, как в реализации функции itoa языка Си. Это ограничение связано только с тем, что для изображения "цифр" 36-ричной системы счисления применяются символы от 0 до 9 и от A до Z (всего 36), а для знаков из систем с ещё большим основанием пришлось бы придумывать какие-то другие обозначения.

Функции просто возвращают ноль или пустую строку в случае возникновения ошибки, это тоже легко улучшить.

const posix='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';

{Обе функции должны работать только с целыми положительными числами}

function FromDec (n:longint;radix:integer):String;
 {Перевод числа n из десятичной в систему счисления с основанием
  radix, 1<radix<37. Вернет полученное число в виде строки
 }
var k:integer;
    s:string;
begin
 if (radix<2) or (radix>36) then begin
  {если неверная система счисления, вернем пустую строку!}
  FromDec:='';
  exit;
 end
 else begin
  s:='';
  repeat
   k:= n mod radix;
   s:=Copy(posix,k+1,1)+s;
   n:= n div radix;
  until n=0;
  FromDec:=s;
 end;
end;

function ToDec (n:String;radix:integer):longint;
var i,l,p:integer;
    r,st:longint;
    s:string;
begin
  l:=length(n);
  r:=0; st:=1;
  for i:=l downto 1 do begin
   s:=Copy (n,i,1);
   p:=Pos(s,posix);
   if (p=0) or (p>radix) then begin {Есть неверный символ в числе n}
    ToDec:=0; {тогда вернем 0}
    exit;
   end;
   r:=r+(p-1)*st;
   st:=st*radix;
  end;
  ToDec:=r;
end;

var s:string;
    r,number:longint;
    radix:integer;
begin
 number:=2009; {Число для теста}
 radix:=8; {Система счисления для теста}
 s:=FromDec(number,radix);
 writeln ('Число ',number,' в системе с основанием ',radix,'=',s);
 r:=ToDec (s,radix);
 writeln ('Обратный перевод в десятичную дал число ',r);
 reset (input); readln;
end.

 Позиционные системы счисления в Википедии

 Проект 17 на странице мидлетов - перевод систем счисления, приложение для мобильника

 Онлайн-реализация на Javascript

Рейтинг@Mail.ru

вверх гостевая; E-mail