Страница 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
" писал(а):в 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;