Системы счисления. Позиционные и непозиционные. Перевод из одной системы счисления в другую. Римская система счисления
Системы счисления делятся на:
- позиционные - одна и та же цифра имеет разное значение в зависимости от позиции $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;