Эта страница или раздел содержит специальные символы Unicode. Если у вас отсутствуют необходимые шрифты, некоторые символы могут отображаться неправильно.
Натуральные числа записываются при помощи повторения этих цифр. При этом, если бо́льшая цифра стоит перед меньшей, то они складываются (принцип сложения), если же меньшая стоит перед большей, то меньшая вычитается из большей (принцип вычитания). Последнее правило применяется только во избежание четырёхкратного повторения одной и той же цифры.
Римские обозначения чисел известны ныне лучше, чем любая другая древняя система счисления. Объясняется это не столько какими-то особыми достоинствами римской системы, сколько тем огромным влиянием, которым пользовалась Римская империя в своё время. Этруски, завоевавшие Рим в VII веке до н. э., испытали на себе влияние восточно-средиземноморских культур. Этим отчасти объясняется сходство основных принципов римской и аттической систем счисления. Обе системы были десятичными[источник не указан 246 дней], хотя в обеих системах счисления особую роль играло число пять. Обе системы использовали при записи чисел повторяющиеся символы.
Старыми римскими символами для обозначения чисел 1, 5, 10, 100 и 1000 (индо-арабской записи) были, соответственно, символы I, V, X, Θ (или ⊕, или ⊗) и Φ (или ↀ , или CIƆ). Хотя о первоначальном значении этих символов было написано много, их удовлетворительного объяснения нет до сих пор. Согласно одной из распространённых теорий, римская цифра V изображает раскрытую руку с четырьмя прижатыми друг к другу пальцами и отставленным большим пальцем; символ X, согласно той же теории, изображает две скрещённые руки или сдвоенную цифру V. Символы чисел 100 и 1000, возможно, берут начало от греческих букв Θ и φ. Неизвестно, произошли ли более поздние обозначения C и M от старых римских символов или они акрофонически связаны с начальными буквами латинских слов, означавших 100 (центум) и 1000 (милле). Полагают, что римский символ числа 500, буква D, возник из половинки старого символа, обозначавшего 1000. Если не считать, что большинство римских символов, скорее всего, не были акрофоническими и что промежуточные символы для обозначения чисел 50 и 500 не были комбинациями символов чисел 5 и 10 или 5 и 100, то в остальном римская система счисления напоминала аттическую. Римляне часто использовали принцип вычитания, поэтому иногда вместо VIIII использовали IX, а вместо LXXXX — XC; сравнительно позднее — символ IV вместо IIII. Поэтому ныне все римские цифры можно записать заглавными латинскими буквами.
В целом римляне не были склонны заниматься математикой, поэтому не испытывали особой потребности в больших числах. Тем не менее, для обозначения 10 000 они эпизодически использовали символ CCIƆƆ, а для числа 100 000 — символ CCCIƆƆƆ. Половинки этих символов иногда использовались для обозначения чисел 5000 (IƆƆ) и 50000 (IƆƆƆ).
1
I
unus, unum
5
V
quinque
10
X
decem
50
L
quinquaginta
100
C
centum
500
D
quingenti
1000
M
mille
Дроби
Дробей римляне избегали так же упорно, как и больших чисел. В практических задачах, связанных с измерениями, они не использовали дроби, подразделяя единицу измерения обычно на 12 частей, с тем чтобы результат измерения представить в виде составного числа, суммы кратных различных единиц, как это делается сегодня, когда длину выражают в ярдах, футах и дюймах. Английские слова ounce («унция») и inch («дюйм») происходят от латинского слова uncia («унция»), обозначавшего одну двенадцатую основной единицы длины[1][2].
Символ 1/2 — буква S использовался в обозначениях номинала монет республиканского периода, однако позднее вышел из употребления. Унция (1/12) обозначалась точкой (·) или (на монетах) в виде маленького выпуклого полушария, иногда — горизонтальной чертой (-), а также (в скорописи) знаками и; обозначением ½ унции (семунции) служили знаки Σ, Є, £, сицилика — Ɔ, секстулы — 𐆓, скрупула — ℈. Однако на практике двенадцатиричные дроби чаще всего изображались сочетанием точек и символа S.
Запись чисел
Арабская запись
Римская запись
1
I
2
II
3
III
4
IV
5
V
6
VI
7
VII
8
VIII
9
IX
10
X
11
XI
12
XII
13
XIII
14
XIV
15
XV
16
XVI
17
XVII
18
XVIII
19
XIX
20
XX
30
XXX
40
XL
50
L
60
LX
70
LXX
80
LXXX
90
XC
100
C
200
CC
300
CCC
400
CD
500
D; IƆ
600
DC; IƆC
700
DCC; IƆCC
800
DCCC; IƆCCC
900
CM; CCIƆ
1000
M; ↀ; CIƆ
2000
MM; CIƆCIƆ
3000
MMM; CIƆCIƆCIƆ
3999
MMMCMXCIX; CIƆCIƆCIƆCCIƆXCIX
4000
MV; ↀↁ; CIƆIƆƆ
5000
V; ↁ; IƆƆ
6000
VM; ↁↀ; IƆƆCIƆ
7000
VMM; ↁↀↀ; IƆƆCIƆCIƆ
8000
VMMM; ↁↀↀↀ; IƆƆCIƆCIƆCIƆ
9000
MX; ↀↂ; CIƆCCIƆƆ
10 000
X; ↂ; CCIƆƆ
20 000
XX; ↂↂ; CCIƆƆCCIƆƆ
30 000
XXX; ↂↂↂ; CCIƆƆCCIƆƆCCIƆƆ
40 000
XL; ↂↇ; CCIƆƆIƆƆƆ
50 000
L; ↇ; IƆƆƆ
60 000
LX; ↇↂ; IƆƆƆCCIƆƆ
70 000
LXX; ↇↂↂ; IƆƆƆCCIƆƆCCIƆƆ
80 000
LXXX; ↇↂↂↂ; IƆƆƆCCIƆƆCCIƆƆCCIƆƆ
90 000
XC; ↂↈ; CCIƆƆCCCIƆƆƆ
100 000
C; ↈ; CCCIƆƆƆ
200 000
CC; ↈↈ; CCCIƆƆƆCCCIƆƆƆ
300 000
CCC; ↈↈↈ; CCCIƆƆƆCCCIƆƆƆCCCIƆƆƆ
400 000
CD; CCCIƆƆƆIƆƆƆƆ
500 000
D; IƆƆƆƆ
600 000
DC; IƆƆƆƆCCCIƆƆƆ
700 000
DCC; IƆƆƆƆCCCIƆƆƆCCCIƆƆƆ
800 000
DCCC
900 000
CM
1 000 000
M
2 000 000
MM
3 000 000
MMM
4 000 000
MV
5 000 000
V
6 000 000
VM
7 000 000
VMM
8 000 000
VMMM
9 000 000
MX
10 000 000
X
100 000 000
C
1 000 000 000
M
1 000 000 000 000
M
1 000 000 000 000 000 000 000 000 000 000 000
M
10^100
X^C
Для правильной записи больших чисел римскими цифрами необходимо сначала записать число тысяч, затем сотен, затем десятков и, наконец, единиц.
В системе римских цифр отсутствует ноль, но ранее использовалось обозначение нуля как nulla («нет»), nihil («ничто») и N (первая буква этих слов).
При этом некоторые из цифр (I, X, C, M) могут повторяться, но не более трёх раз подряд; таким образом, с их помощью можно записать любое натуральное число не более 3999 (MMMCMXCIX). В ранние периоды существовали знаки для обозначения бо́льших цифр — 5000, 10 000, 50 000 и 100 000[источник не указан 5016 дней] (тогда максимальное число по упомянутому правилу равно 399 999). При записи чисел в римской системе счисления меньшая цифра может стоять справа от большей; в этом случае она прибавляется к ней. Например, число 283 по-римски записывается как CCLXXXIII, то есть 100+100+50+10+10+10+1+1+1=283. Здесь цифра, изображающая сотню, повторена два раза, а цифры, изображающие соответственно десяток и единицу, повторены по три раза.
Пример: число 1988. Одна тысяча M, девять сотен CM, восемь десятков LXXX, восемь единиц VIII. Запишем их вместе: MCMLXXXVIII.
Довольно часто, чтобы выделить числа в тексте, над ними рисовали черту: LXIV. Иногда черту рисовали и сверху, и снизу: XXXII — в частности, так принято выделять римские цифры в русском рукописном тексте (в типографском наборе это не используют из-за технической сложности). У других авторов черта сверху могла обозначать увеличение значения цифры в 1000 раз: V = 5000.
Повсеместно записывать число «четыре» как IV стали только в XIX веке, до этого наиболее часто употреблялась запись IIII. Однако запись IV можно встретить уже в документах манускрипта Forme of Cury, датируемых 1390 годом. На циферблатах часов в большинстве случаев традиционно используется IIII вместо IV, главным образом, по эстетическим соображениям, такое написание обеспечивает визуальную симметрию с цифрами VIII на противоположной стороне, а перевёрнутую IV прочесть труднее, чем IIII. Существует и версия, что IV на циферблате не писалось потому, что IV — первые буквы латинского имени бога Юпитера (IVPITER)[источник не указан 246 дней].
Меньшая цифра может быть записана и слева от большей, тогда её следует вычесть из большей. При этом вычитаться могут только цифры, обозначающие 1 или степени 10, а в качестве уменьшаемого выступать только ближайшие в числовом ряду к вычитаемой две цифры (то есть вычитаемое, умноженное на 5 или 10). Повторения меньшей цифры не допускаются. Таким образом, существует только шесть вариантов использования «правила вычитания»:
IV = 4
IX = 9
XL = 40
XC = 90
CD = 400
CM = 900
Например, число 94 будет XCIV = 100 − 10 + 5 − 1 = 94 — так называемое «правило вычитания» (появилось в эпоху поздней античности, а до этого римляне писали число 4 как IIII, а число 40 — как XXXX).
Другие способы «вычитания» недопустимы; так, число 99 должно быть записано как XCIX, но не как IC. Однако, в наши дни в некоторых случаях используется и упрощенная запись римских чисел, например, в программе Microsoft Excel при преобразовании арабских цифр в римские при помощи функции «РИМСКОЕ()» можно использовать несколько видов представления чисел, от классического до сильно упрощённого (так, число 499 может быть записано как CDXCIX, LDVLIV, XDIX, VDIV или ID). Упрощение состоит в том, что для уменьшения какой-либо цифры слева от неё может писаться любая другая цифра:
999. Тысяча (M), вычтем 1 (I), получим 999 (IM) вместо CMXCIX. Следствие: 1999 — MIM вместо MCMXCIX
95. Сто (C), вычтем 5 (V), получим 95 (VC) вместо XCV
Случаи такой записи чисел (как правило, годов) часто встречаются в титрах телесериалов США. Например, для года 1998 — MIIM вместо MCMXCVIII.
С помощью римских цифр можно записывать и бо́льшие классы чисел. Для этого над теми цифрами, которые обозначают тысячи, ставится черта, а над цифрами, которые обозначают миллионы, — двойная черта. Исключение составляет цифра I; вместо черты сверху записывается цифра M, а начиная с миллиона — по одной черте сверху. Например, число 123123 будет выглядеть так:
CXXIIICXXIII
А миллион как I, но только не с одной, а с двумя чертами во главе: I
Применение
В русском языке римские цифры используют в следующих случаях:
Номер века или тысячелетия: XIX век, II тысячелетие до н. э.
В математическом анализе римскими цифрами записывают номер производной, правда, при чтении (обычно) произносят «штрих» вместо I, «два штриха» вместо II, «три штриха» вместо III. Наконец, начиная с IV читают «четвёртая производная»: и .
Римские цифры широко употребляли в Европе и СССР при указании даты для обозначения месяца года, например, 11/III-85 или 9.XI.89, это можно увидеть на многих архивных документах тех времён. Подобным образом, через косую черту, в том числе записывали дату урока в классных журналах, например, 24/II. Для указания дат рождения и смерти на надгробиях часто использовали особый формат, где месяц года также обозначали римскими цифрами, например, (25 ноября 1887 ~ 26 января 1943). Подобный формат в 1970—1980-х годах использовали в медицинских справках.
С переходом на компьютерную обработку информации форматы даты, основанные на римских цифрах, практически вышли из употребления.
В других языках сфера применения римских цифр может иметь особенности. В западных странах римскими цифрами нередко записывают номер года, например, на фронтонах зданий и в титрах видео-, кино- и телепродукции[3].
Стандарт Юникода рекомендует использовать для представления римских цифр обычные латинские буквы[4]. Тем не менее стандарт включает также специальные символы для римских цифр как часть Числовых форм (англ.Number Forms)[5] в области знаков с кодами с U+2160 по U+2188. Например, MCMLXXXVIII может быть представлено в форме ⅯⅭⅯⅬⅩⅩⅩⅧ. Этот диапазон включает как строчные, так и прописные цифры для записи чисел от 1 (Ⅰ или I) до 12 (Ⅻ или XII), в том числе и комбинированные глифы для составных чисел, таких как 8 (Ⅷ или VIII), главным образом для обеспечения совместимости с восточноазиатскими наборами символов в таких промышленных стандартах, как JIS X 0213, где эти символы определены. Комбинированные глифы используются для представления чисел, которые ранее составлялись из отдельных символов (например, Ⅻ вместо его представления как Ⅹ и Ⅱ). В дополнение к этому, глифы существуют для архаичных[5] форм записи чисел 1000, 5000, 10 000, большой обратной C (Ɔ), поздней формы записи 6 (ↅ, похожей на греческуюстигму: Ϛ), ранней формы записи числа 50 (ↆ, похожей на стрелку, указывающую вниз ↓⫝⊥[6]), 50 000, и 100 000. Маленькая обратная c, ↄ не включена в символы римских цифр, но включена в стандарт Юникод как прописнаяклавдиева буква Ↄ.
Отображение всех этих символов требует наличия программного обеспечения, поддерживающего стандарт Юникод, и шрифта, содержащего соответствующие этим символам глифы (например, шрифтUniversalia).
Машинопись
На пишущей машинке с русским шрифтом для написания отсутствующих латинских знаков используются визуально похожие русские буквы и арабская цифра 1, имеющая в машинописном шрифте написание I. Для L и D допускается использование Л и Д[8].
Регулярное выражение для проверки римских цифр — ^(M{0,3})(D?C{0,3}|C[DM])(L?X{0,3}|X[LC])(V?I{0,3}|I[VX])$[10]
В языке Perl для поиска римских цифр в строке можно использовать регулярное выражение
m/\b((?:M{0,3}?(?:D?C{0,3}|C[DM])?(?:L?X{0,3}|X[LC])?(?:I{0,3}?V?I{0,3}|I[VX])))\b/gs.
Преобразование
Для преобразования чисел, записанных арабскими цифрами в римские, используются специальные функции.
Например, в английской версии Microsoft Excel и в любой версии OpenOffice.org Calc для этого существует функция ROMAN (аргумент; форма),
в русской версии Microsoft Excel эта функция называется РИМСКОЕ(число; форма).
Необязательный аргумент «форма» может принимать значения от 0 до 4, а также «Ложь» и «Истина». Отсутствие аргумента «Форма» или равенство его 0 или «Истина» даёт «классическую» (строгую) форму преобразования; значение 4 или «Ложь» даёт наиболее упрощённую; значения 1, 2, 3 дают промежуточные по строгости-упрощению варианты. Различия проявляются, например, на числах 45, 49, 495, 499 (указаны первые в диапазоне [1;3999]).
Пример применения функции
РИМСКОЕ(число; форма)
форма
0
1
2
3
4
число
45
XLV
VL
VL
VL
VL
49
XLIX
VLIV
IL
IL
IL
495
CDXCV
LDVL
XDV
VD
VD
499
CDXCIX
LDVLIV
XDIX
VDIV
ID
Для нецелых значений аргумента «число» производится округление вниз до целого; если после этого значение оказывается больше 3999 или меньше 0, то функция возвращает «#Знач»; для значения 0 возвращается пустая ячейка.
Программа перевода арабских цифр в римские и наоборот на языке Pascal[11]
typestr2=string[2];constRims:array[1..14]ofstr2=('M','CM','D','CD','C','XC','L','XL','X','IX','V','IV','I',' ');Arab:array[1..14]ofinteger=(1000,900,500,400,100,90,50,40,10,9,5,4,1,0);varN,NI,I,J:integer;S:string;functionArab2Rim(N:integer):string;varS:string;I:integer;beginS:='';I:=1;whileN>0dobeginwhileArab[I]<=NdobeginS:=S+Rims[I];N:=N-Arab[I]end;I:=I+1end;Arab2Rim:=Send;functionRim2Arab(S:string):integer;varI,N:integer;beginI:=1;N:=0;whileS<>''dobeginwhileRims[I]=Copy(S,1,Length(Rims[I]))dobeginS:=Copy(S,1+Length(Rims[I]),255);N:=N+Arab[I]end;I:=I+1end;Rim2Arab:=Nend;beginWriteLn('Перевод из арабских цифр в римские. 1999 B_SA');{ Write('Введите число для преобразования:'); ReadLn(N);}forNI:=26to46doWriteLn(NI,' = ',Arab2Rim(NI),' обратно ',Rim2Arab(Arab2Rim(NI)));end.
Функция преобразования арабского числа в римское на Pascal[12]
Функция преобразования арабского числа (в данном случае 1999) в римское на Perl
usestrict;usewarnings;my$n=1999;my$nums=[['',qw(I II III IV V VI VII VIII IX)],['',qw(X XX XXX XL L LX LXX LXXX XC)],['',qw(C CC CCC CD D DC DCC DCCC CM)],['',qw(M MM MMM)]];my$i=0;my@res=();push@res,($nums->[$i++][($n%10,$n=int($n/10))[0]])for0..3;printreverse@res;
Класс для преобразования арабского числа (от 1 до 3999) в римское на Java
Extension class для преобразования римского числа в арабское и обратно, на CSharp
/// <summary>/// Класс предназначен для преобразований арабских чисел в римские и обратно/// </summary>/// <remarks>/// <para>Класс изначально содержит алфавит римских чисел, способных определять арабские числа от 1 до 39999</para>/// <para>Если необходимо расширить диапазон, то можно определить дополнительные обозначения для римских чисел, используя/// поле <see cref="БазовыеРимскиеЧисла"/>БазовыеРимскиеЧисла</remarks>publicstaticclassРимскоеЧисло{/// <summary>/// Алфавит базовых римских чисел/// <para>Алфавит построен в виде словаря. Ключом словаря является арабское число (int), значением - соответствующее ему/// римское число (string)</para>/// </summary>/// <remarks>/// <para>Содержит римское обозначения арабских чисел 1*,4*,5*,9* - где "*"представляет собой 0...N нулей</para>/// <para>При создании содержит в себе обозначение чисел от 1 до 10000 (I...ↂ) Так как в римском числе один символ не может/// встречаться более трех раз, то изначально можно преобразовать в римский формат числа от 1 до 39999.</para> /// <para>Если Вы хотите иметь возможность работать с большим количеством римских чисел, то вы должны добавить в список /// дополнительные обозначения начиная с 40000 не пропуская элементы 1*,4*,5*,9*.</para>/// </remarks>publicstaticSortedList<int,string>БазовыеРимскиеЧисла{get;set;}staticРимскоеЧисло(){БазовыеРимскиеЧисла=newSortedList<int,string>(17);БазовыеРимскиеЧисла.Add(1,"I");БазовыеРимскиеЧисла.Add(4,"IV");БазовыеРимскиеЧисла.Add(5,"V");БазовыеРимскиеЧисла.Add(9,"IX");БазовыеРимскиеЧисла.Add(10,"X");БазовыеРимскиеЧисла.Add(40,"XL");БазовыеРимскиеЧисла.Add(50,"L");БазовыеРимскиеЧисла.Add(90,"XC");БазовыеРимскиеЧисла.Add(100,"C");БазовыеРимскиеЧисла.Add(400,"CD");БазовыеРимскиеЧисла.Add(500,"D");БазовыеРимскиеЧисла.Add(900,"CM");БазовыеРимскиеЧисла.Add(1000,"M");БазовыеРимскиеЧисла.Add(4000,"Mↁ");БазовыеРимскиеЧисла.Add(5000,"ↁ");БазовыеРимскиеЧисла.Add(9000,"Mↂ");БазовыеРимскиеЧисла.Add(10000,"ↂ");}/// <summary>/// Рассчитывает максимально возможное римское число для текущего алфавита римских чисел./// </summary>/// <returns>Максимально возможное римское число</returns>publicstaticuintМаксимальноеРимскоеЧисло(){intпоследнееЧисло=БазовыеРимскиеЧисла.Keys.Last();intчислоБезНулей=int.Parse(последнееЧисло.ToString().Replace('0','\0'));intпредварительное=0;switch(числоБезНулей){case1:предварительное=последнееЧисло*4-1;break;case4:case9:предварительное=последнееЧисло;break;case5:предварительное=последнееЧисло+последнееЧисло/5*3;break;default:break;}returnuint.Parse(предварительное.ToString().Replace('0','9'));;}/// <summary>/// Конвентирует целое число в римское число/// </summary>/// <param name="числоАраб">Арабское число, которое необходимо преобразовать в римскую запись</param>/// <exception cref="ArgumentOutOfRangeException">Генерируется когда в качестве параметра передано число равное "0" /// или число большее чем максимальная римское число.</exception>/// <returns>Строку, представляющую собой римской число</returns>publicstaticstringАрабскоеВРимское(thisintчислоАраб){StringBuilderчислоРимское=newStringBuilder();//Исключаем знак "-" из арабского числа и делаем его первым символом римского числаif(числоАраб<0){числоРимское.Append("-");числоАраб=-числоАраб;}if(числоАраб==0)thrownewArgumentOutOfRangeException("числоАраб",числоАраб,"Недопустимое значение аргумента: римские числа не могут быть равными\"0\"");elseif(числоАраб>МаксимальноеРимскоеЧисло())thrownewArgumentOutOfRangeException("числоАраб",числоАраб,string.Format("Недопустимое значение аргумента: невозможно задать римское число большее чем {0}",МаксимальноеРимскоеЧисло()));//Раскладываем арабское число на составляющие его римские числа и объединяем их в одну строкуvarнеобходимыеБазовыеРимскиеЧисла=fromкinБазовыеРимскиеЧисла.Keyswhereк<=числоАрабorderbyкdescendingselectк;foreach(intтекinнеобходимыеБазовыеРимскиеЧисла){while((числоАраб/тек)>=1){числоАраб-=тек;числоРимское.Append(БазовыеРимскиеЧисла[тек]);}}returnчислоРимское.ToString();}/// <summary>/// Конвентирует римское число в арабское/// </summary>/// <param name="числоРимское">Римское число, которое необходимо преобразовать в тип int</param>/// <exception cref="FormatException">Генерируется когда в качестве параметра передано число не являющееся римским</exception>/// <returns>Целое число, представляющее собой арабскую запись римского числа</returns>publicstaticintРимскоеВАрабское(thisstringчислоРимское){intчислоАраб=0;sbyteотрицательное=1;stringрим=числоРимское.Trim();if(рим[0]=='-'){отрицательное=-1;рим=рим.Substring(1);}StringBuilderшаблонРимскогоНомера=newStringBuilder();foreach(intкinБазовыеРимскиеЧисла.Keys){intиндекс=БазовыеРимскиеЧисла.Keys.IndexOf(к);stringквантификатор="?";if(индекс==0||(индекс%4)==0)квантификатор="{0,3}";шаблонРимскогоНомера.Insert(0,string.Format("(?<{0}>({1}){2})?",к.ToString(),БазовыеРимскиеЧисла[к],квантификатор));}//Игнорировать регистр + соответствие должно начинаться с начала строкишаблонРимскогоНомера.Insert(0,"(?i)^");//Соответствие должно обнаруживаться в конце строкишаблонРимскогоНомера.Append("$");//Упрощенная проверка. Не проверяет таких ошибок как IVIIif(!Regex.IsMatch(рим,шаблонРимскогоНомера.ToString()))thrownewFormatException(string.Format("Текст \"{0}\" не является римским числом",числоРимское));Matchчисло=Regex.Match(рим,шаблонРимскогоНомера.ToString());foreach(intкinБазовыеРимскиеЧисла.Keys){числоАраб+=число.Groups[к.ToString()].Length/БазовыеРимскиеЧисла[к].Length*к;}returnчислоАраб*отрицательное;}}