var s, si, sf: string; powm, n10i: longint; i, j, m, ls, err, ni, nf: integer; a: double;
begin Write('Введите основание системы счисления (2..9): '); Readln(m); if not (m in [2..9]) then Writeln('Ну-ну...') else begin Write('Введите положительное число в этой системе счисления: '); Readln(s); ls := Length(Trim(s)); i := pos('.', s); if i > 0 then begin ni := i - 1; si := Copy(s, 1, ni); nf := ls - i; sf := Copy(s, i + 1, nf) end else begin si := s; ni := ls; sf := ''; nf := 0 end; powm := 1; n10i := 0; for i := ni downto 1 do begin Val(si[i], j, err); n10i := n10i + j * powm; powm := powm * m end; powm := m; a := 0; for i := 1 to nf do begin Val(sf[i], j, err); a := a + j / powm; powm := powm * m end; a := a + n10i; Writeln(s, '(', m, ')=', a, '(10)') end; end.
Тестовое решение:
Введите основание системы счисления (2..9): 8 Введите положительное число в этой системе счисления: 23532.5034 23532.5034(8)=10074.6318359375(10)
2483,51(10) - отдельно переводим в восьмеричную с/с целую и дробную части. Целую часть переводим целочисленным последовательным делением на 8 с выписыванием остатков. 2483/8=310, остаток 3 310/8=38, остаток 6 38/8=4, остаток 6 Теперь записываем частное и приписываем остатки от последней строчки к первой. Получаем 4663(8) - это и есть 2483(10) Дробную часть переводим, производя последовательное умножение на 8 и отбрасывая целые части результата. Прекращаем операцию, если получаем при умножении ноль или не видно дальнейшего смысла продолжать. Отброшенные по порядку целые части образуют искомые цифры восьмеричного представления дробной части. 0.51x8=4.08 (4) 0.08x8=0.64 (0) 0.64x8=5.12 (5) 0.12x8=0.96 (0) 0.96x8=7.68 (7) 0.68x8=5.44 (5) Достаточно. 0.51(10)≈0.405075(8)
Чтобы перейти к двоичной системе счисления, достаточно каждую восьмеричную цифру заменить эквивалентной двоичной триадой 4663.405075(8)=100 110 110 011.100 000 101 000 111 101(2)
Для перехода от двоичной системе к шестнадцатиричной достаточно разделить двоичное число тетрадами, начиная от десятичной точки в обе стороны, а затем каждую тетраду заменить шестнадцатиричной цифрой. 1001 1011 0011.1000 0010 1000 1111 0100(2)=9B3.824F4(16)
Для перехода к десятичной системе записываем число в расширенном представлении по степеням 16 и выполняем арифметические операции.
k = 50;
var
s, si, sf: string;
powm, n10i: longint;
i, j, m, ls, err, ni, nf: integer;
a: double;
begin
Write('Введите основание системы счисления (2..9): ');
Readln(m);
if not (m in [2..9]) then Writeln('Ну-ну...')
else begin
Write('Введите положительное число в этой системе счисления: ');
Readln(s);
ls := Length(Trim(s));
i := pos('.', s);
if i > 0 then begin
ni := i - 1; si := Copy(s, 1, ni);
nf := ls - i; sf := Copy(s, i + 1, nf)
end
else begin si := s; ni := ls; sf := ''; nf := 0 end;
powm := 1; n10i := 0;
for i := ni downto 1 do
begin
Val(si[i], j, err);
n10i := n10i + j * powm;
powm := powm * m
end;
powm := m; a := 0;
for i := 1 to nf do
begin
Val(sf[i], j, err);
a := a + j / powm;
powm := powm * m
end;
a := a + n10i;
Writeln(s, '(', m, ')=', a, '(10)')
end;
end.
Тестовое решение:
Введите основание системы счисления (2..9): 8
Введите положительное число в этой системе счисления: 23532.5034
23532.5034(8)=10074.6318359375(10)
2483/8=310, остаток 3
310/8=38, остаток 6
38/8=4, остаток 6
Теперь записываем частное и приписываем остатки от последней строчки к первой. Получаем 4663(8) - это и есть 2483(10)
Дробную часть переводим, производя последовательное умножение на 8 и отбрасывая целые части результата. Прекращаем операцию, если получаем при умножении ноль или не видно дальнейшего смысла продолжать.
Отброшенные по порядку целые части образуют искомые цифры восьмеричного представления дробной части.
0.51x8=4.08 (4)
0.08x8=0.64 (0)
0.64x8=5.12 (5)
0.12x8=0.96 (0)
0.96x8=7.68 (7)
0.68x8=5.44 (5)
Достаточно. 0.51(10)≈0.405075(8)
Чтобы перейти к двоичной системе счисления, достаточно каждую восьмеричную цифру заменить эквивалентной двоичной триадой
4663.405075(8)=100 110 110 011.100 000 101 000 111 101(2)
Для перехода от двоичной системе к шестнадцатиричной достаточно разделить двоичное число тетрадами, начиная от десятичной точки в обе стороны, а затем каждую тетраду заменить шестнадцатиричной цифрой.
1001 1011 0011.1000 0010 1000 1111 0100(2)=9B3.824F4(16)
Для перехода к десятичной системе записываем число в расширенном представлении по степеням 16 и выполняем арифметические операции.