Pers.narod.ru. Алгоритмы. Перевод целого числа из десятичной и в десятичную систему счисления |
Перевести произвольное целое число из деятичной системы счисления в систему счисления с любым другим основанием. Перевести число произвольной из системы счисления в десятичную.
В листинге ниже показаны 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
гостевая; E-mail |