Страница 1 из 1

Перевод из одной с.с. в другую при помощи рекурсии.

Добавлено: 03 май 2008, 20:49
Lgun
Нужно реализовать перевод целого числа из одной системы счисления в другую (между основными - 2, 8, 10, 16), используя рекурсивные функции или процедуры. Алгоритм самого перевода ясен, а вот куда там припахать рекурсию, идей нет. Подскажите плиз.

Re: Перевод из одной с.с. в другую при помощи рекурсии.

Добавлено: 03 май 2008, 22:19
MOTOCoder
Вместо того, чтобы проводить вычисления в цикле, который наверняка присутствует в алгоритме перевода, используйте рекурсивную функцию.

Re: Перевод из одной с.с. в другую при помощи рекурсии.

Добавлено: 04 май 2008, 11:33
Хыиуду
Ну к примеру, из восьмеричной в двоичную. Задана строка s8

Код: Выделить всё

function s8_to_s2(s8:string): string;
var tmp:string;
begin
  if s8='' then s8_to_s2:=''
  else 
  begin
     if s8[1]='0' then tmp:='000' else
     if s8[1]='1' then tmp:='001' else
   {и так далее}
     if s8[1]='7' then tmp:='111';
     s8_to_s2=tmp+s8_to_s2(copy(s8,2, length(s8));
  end;
end;

Re: Перевод из одной с.с. в другую при помощи рекурсии.

Добавлено: 04 май 2008, 20:35
Lgun
Спасибо, я что-то подобное и буду делать, но через две функции - "любая в 10-ую" и "10-ая в любую" при помощи стандартных формул. Следовательно, встает вопрос: в pascale есть более удобные средства для работы с 16-ричными числами? Чтобы не описывать каждую букву подобно вышеприведенному примеру?

Re: Перевод из одной с.с. в другую при помощи рекурсии.

Добавлено: 04 май 2008, 23:18
Serge_Bliznykov
&quot писал(а):в pascale есть более удобные средства для работы с 16-ричными числами
нет.
можно так - описывайте
const
Digits:array[0..$F]of char='0123456789ABCDEF';
и работайте с ним (Digits...)

Re: Перевод из одной с.с. в другую при помощи рекурсии.

Добавлено: 04 май 2008, 23:22
Serge_Bliznykov
кстати, вот, может поможет.
программа перевода из 10-й системы в любую (<=16)
чем (с) не знаю, но код чужой!

Код: Выделить всё

CONST Digit: STRING[16]='0123456789ABCDEF';
FUNCTION Fromdec(N, Radix: LONGINT): STRING;
VAR
  S: STRING;
BEGIN
  S := '';
  REPEAT
    S := Digit[(N MOD Radix) + 1] + S;
    N := N DIV Radix;
  UNTIL N = 0;
  Fromdec := S;
END;
...

Re: Перевод из одной с.с. в другую при помощи рекурсии.

Добавлено: 05 май 2008, 01:24
Lgun
Всем спасибо, код написан) Если кому интересно, вот рабочие функции:
function HDig(Ch: CHAR): BYTE;
var
i,n: byte;

begin
n := 0;
for i := 1 to length(HexDig) do
if Ch = HexDig then n := i-1;
HDig := n;
end;

function ToDec(s:string;i:byte):extended;
begin
if length(s)=1 then ToDec:=HDig(UpCase(s[1]))
else ToDec:=HDig(UpCase(s[1]))*exp((length(s)-1)*ln(i))+ToDec(copy(s,2,length(s)),i);
end;

function FromDec(s:integer;i:byte):string;
begin
if s < i then FromDec := HexDig[s+1]
else
FromDec:= FromDec(s div i,i)+ HexDig[(s mod i)+1];
end;