Системы счисления. Позиционные и непозиционные. Перевод из одной системы счисления в другую. Римская система счисления
Системы счисления делятся на:
- позиционные - одна и та же цифра имеет разное значение в зависимости от позиции $143=1 \cdot 10^2 + 4 \cdot 10 + 3$.
- непозиционные - число задаётся несколькими знаками с различным значением.
- смешанные - например, римская система счисления $IX = 9$ - значение зависит от позиции цифр, но есть ограничения.
Системы счисления
Позиционные и непозиционные
Позиционные - значение зависит от позиции цифры.
Например, десятичная система счисления: $343=3*10^2+4*10^1+3$
Перевод из одной системы счисления в другую
Мы считаем в десятичной системе счисления.
Перевод из десятичной в двоичную - деление в столбик или сравнение по таблице степеней двойки.
Перевод обратно, из двоичной в десятичную - умножение разрядов на степени двойки и сложение.
Непозиционная: Римская система счисления
I - 1, V - 5, X - 10, D - 50, L - 500, M - 1000 - значение не зависит от позиции (зависит по-другому).
Двоичная система счисления (запись чисел)
Позиционная система счисления с основанием 2, Числа записываются с помощью двух символов: 0 и 1.
Например: число $3 = 11_2$.
$\ x_{2,2} = a_{n-1} a_{n-2}\dots a_{1} a_{0\ 2,2} = \sum_{k=0}^{n-1} a_k b^k = \sum_{k=0}^{n-1} a_k 2^k,$
где:
- $\ x_{2,2}$ — представляемое число, первый индекс - основание системы счисления (размерность множества цифр $a={0,1}$), второй индекс - основание весовой показательной функции $b$ (в двоично-десятичном кодировании $b=10$),
- $\ a_{n-1}a_{n-2}...a_1a_0$ — запись числа, строка цифр,
- $\ .\ .\ .\ _{2,2}$ — обозначение основания системы кодирования и основания системы счисления,
- $n$ — количество цифр (знаков) в числе $x_{2,2}$,
- $k$ — порядковый номер цифры,
- $a_k$ — цифры числа $x_{2,2} из множества $a={0,1}$, в двоичной системе счисления, основание системы кодирования равно 2,
- $b=2$ — основание показательной весовой функции, основание системы счисления,
- $b^k=2^k$ — весовая показательная функция, создающая весовые коэффициенты.
Восьмеричная, шестнадцатеричная
Позиционная целочисленная система счисления с основанием 8 (используются цифры от 0 до 7).
Таблица перевода восьмеричных чисел в двоичные:
08 = 000218 = 0012
28 = 0102
38 = 0112
48 = 1002
58 = 1012
68 = 1102
78 = 1112
Для перевода восьмеричного числа в двоичное необходимо заменить каждую цифру восьмеричного числа на триплет двоичных цифр. Например: 25418 = [ 28 | 58 | 48 | 18 ] = [ 0102 | 1012 | 1002 | 0012 ] = 0101011000012
Перевод целых чисел из 10 системы счисления в любую
Для перевода надо делить "в столбик" число на основание системы счисления. Каждый очередной остаток будет цифрой числа
Вывод числа в произвольной системе счисления:
{$APPTYPE CONSOLE}
uses SysUtils;
var
x, b : longint;
s : string; { Результат преобразования }
begin
Write('Введите число: '); Readln(x);
Write('Введите основание системы счисления: '); Readln(b);
s := '';
while x > 0 do begin
s := IntToStr(x mod b) + s; { Остаток - это очередная цифра. Приписываем её спереди к числу }
x := x div b; { Делим на основание системы счисления }
end;
if s = '' then s := '0';
writeln('Результат: ',s);
end.
Перевод целых чисел из 2-й, 8-й, 16-й в 10 сс
Для перевода умножаем каждую последующую цифру на соответствующую степень 2-ки, 8-рки, 16-ти
Для двоичного числа: $x = a_n{\cdot}2^n + ... + a_1{\cdot}2^1 + a_0{\cdot}2^0$Перевод дробных чисел из 2-й в 10 сс и обратно
Римская система счисления
| 1 | I | лат. unus |
| 5 | V | лат. quinque |
| 10 | X | лат. decem |
| 50 | L | лат. quinquaginta |
| 100 | C | лат. centum |
| 500 | D | лат. quingenti |
| 1000 | M | лат. mille |
{$APPTYPE CONSOLE}
{ Функция для перевода из десятичной системы в римскую }
function to_roman( n : integer ):string;
const D : array [1..13] of integer = (1,4,5,9,10,40,50,90,100,400,500,900,1000);
S : array [1..13] of string = ('I','IV','V','IX','X','XL','L','XC','C','CD','D','CM','M');
var k : integer;
begin
result := '';
for k := high(D) downto low(D) do { Идём от старших разрядов к младшим }
while D[k] <= n do begin
dec(n, D[k]);
result := result + S[k];
end;
end;
var N,Tests,Test : integer;
begin
assign(input,'roman.in'); reset(input);
assign(output,'roman.out'); rewrite(output);
readln(Tests); { Количество тестов }
for Test := 1 to Tests do begin { Цикл по тестам }
readln(N);
writeLn(to_roman(N));
end;
end.
Реализация через массив с записями
const
T : array [1..13] of record D:integer; S:string; end = (
(D:1000; S:'M'), (D:900; S:'CM'),
(D:500; S:'D'), (D:400; S:'CD'),
(D:100; S:'C'), (D:90; S:'XC'),
(D:50; S:'L'), (D:40; S:'XL'),
(D:10; S:'X'), (D:9; S:'IX'),
(D:5; S:'V'), (D:4; S:'IV'),
(D:1; S:'I'));
{ Функция для перевода из десятичной системы в римскую }
function to_roman( N : integer ):string;
var i : integer;
begin
result := '';
for i := 1 to 13 do
while T[i].D <= n do begin
dec(N, T[i].D);
result := result + T[i].S;
end;
end;