Системы счисления. Позиционные и непозиционные. Перевод из одной системы счисления в другую. Римская система счисления

Системы счисления делятся на:

Системы счисления

Позиционные и непозиционные

Позиционные - значение зависит от позиции цифры.

Например, десятичная система счисления: $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,$
где:

Восьмеричная, шестнадцатеричная

Позиционная целочисленная система счисления с основанием 8 (используются цифры от 0 до 7).

Таблица перевода восьмеричных чисел в двоичные:

08 = 0002
18 = 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;