( НА ЯЗЫКЕ С++ ) Напишите процедуру, которая выводит на экран запись переданного ей числа в римской системе счисления. I -1, V – 5, X – 10, L – 50, C – 100, D – 500, M – 1000 Натуральные числа записываются при помощи повторения этих цифр. При этом, если большая цифра стоит перед меньшей, то они складываются (принцип сложения), если же меньшая стоит перед большей, то меньшая вычитается из большей (принцип вычитания). Последнее правило применяется только во избежание четырёхкратного повторения одной и той же цифры. Для правильной записи больших чисел римскими цифрами необходимо сначала записать число тысяч, затем сотен, затем десятков и, наконец, единиц. При этом некоторые из цифр (I, X, C, M) могут повторяться, но не более трёх раз подряд; таким образом, с их помощью можно записать любое целое число не более 3999 (MMMCMXCIX)
string arabicToRoman(unsigned amp;number)
<
const unsigned count = 13;unsigned arabic[count] = < 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1
>, i, j;
string roman[count] = < "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX",
«V», «IV», «I» >, result = «»;
for (i = 0; i lt; count; i++) <
for (j = 0; j lt; number / arabic[i]; j++) <
result += roman[i];
>
number = arabic[i];
>
return result;
>
int main()
<
unsigned uin = 0;
cin gt;gt; uin;
cout lt;lt; arabicToRoman(uin);
system(«pause»);
return 0;
>
1)Напишите процедуру в программе Pascal ABC(Паскаль), которая выводит на экран в столбик все цифры переданного ей числа,
procedure sr(n:integer);
var k, m:integer;
begin
k:=n mod 10;n:=n div 10;
while n <> 0 do
begin
k:=k*10+n mod 10;
n:=n div 10;
end;
while k <> 0 do
begin
m:=k mod 10;
writeln(m);
k:=k div 10;
end;
end;
begin
write(‘ введите число a ‘); // вводим с клавиатуры число
read(a);
sr(a); // вызываем процедуру
end.
2)program zz1;
var
s: Array [1..4] of String;
n: Integer;
Procedure Inc4;
Begin
If (s[4] = ‘IV’) then s[4] := ‘V’ Else
If (s[4] = ‘VIII’) then s[4] := ‘IX’ Else
If (s[4][1] = ‘I’) then If (Length(s[4]) < 3) then s[4] := s[4] + ‘I’
Else s[4] := ‘IV’
Else s[4] := s[4] + ‘I’;
If (s[4] = ‘ I’) then s[4] := ‘I’;
End;
Procedure Inc3;
Begin
If (s[3] = ‘XL’) then s[3] := ‘L’ Else
If (s[3] = ‘LXXX’) then s[3] := ‘XC’ Else
If (s[3][1] = ‘X’) then If (Length(s[3]) < 3) then s[3] := s[3] + ‘X’
Else s[3] := ‘XL’
Else s[3] := s[3] + ‘X’; s[4] := ‘ ‘;
If (s[3] = ‘ X’) then s[3] := ‘X’;
End;
Procedure Inc2;
Begin
If (s[2] = ‘CD’) then s[2] := ‘D’ Else
If (s[2] = ‘DCCC’) then s[2] := ‘CM’ Else
If (s[2][1] = ‘C’) then If (Length(s[2]) < 3) then s[2] := s[2] + ‘C’
Else s[2] := ‘CD’
Else s[2] := s[2] + ‘C’; s[3] := ‘ ‘; s[4] := ‘ ‘;
If (s[2] = ‘ C’) then s[2] := ‘C’;
End;
begin
Write(‘Введите число меньше 4000: ‘); Read(n);
If (n > 3999) then n := 3999; Write(n, ‘ = ‘);
s[1]:=’ ‘; s[2]:=’ ‘; s[3]:=’ ‘; s[4]:=’ ‘;
While (n > 0) do begin
Dec(n);
If (s[4] <> ‘IX’) then Inc4 Else
If (s[3] <> ‘XC’) then Inc3 Else
If (s[2] <> ‘CM’) then Inc2
Else begin
s[1] := s[1] + ‘M’; s[2] := ‘ ‘; s[3] := ‘ ‘; s[4] := ‘ ‘; End;
End;
For n := 1 to 4 do If (s[n] <> ‘ ‘) then Write(s[n]);
end.
0b1001 путей решения задачи перевода чисел в римскую запись

Привет друзья. Вот вам простенькая задачка. Как бы вы перевели арабские числа в римские используя Python? Правда с одним условием — числа не могут быть больше чем 4000.
Я думаю это должно быть просто, но позвольте я вам покажу вам серию интересных решений и не тривиальных подходов:
«13 шагов» от StefanPochmann
Очень простая идея и при этом самая популярная. Мы делаем таблицу соответствий арабских и римских чисел. Идя по таблице этих соответствий мы уменьшая арабское число и увеличиваем римское.
Я добавил функцию print для вас, чтобы решение было понятнее. И вот какой будет вывод:
Теперь вы видите, как на каждой итерации меняется римское и арабское числа.
«thous, hunds, tens и ones» от mdeakyne
В этом случае у нас уже есть обратное соответствие арабских к римским. При этом нам уже не нужен цикл.
«base.replace» от MaikSchoepe
Я верю, что это не самый эффективный способ решения, но один из самых веселых. Он начинается с того, что делает длинную строку из “I”, размером с переданное число. Следующей строй заменяет каждые пять символов “I” на символ “V”. Далее два “V” на “X” и так далее. В конце пути мы получим строку, которую мы искали.
«Enum» от veky
Для того, чтобы понять, как работает следующее решение вам надо знать модуль Enum. Если не знаете — есть отличный шанс погуглить его.
В целом пример работает так-же как мы видели в первом примере от StefanPochmann, но кое-каким синтаксическим сахором. Таким как Enum и yield
«A derelict battery» от veky
Все эти решения я собрал с CheckiO.
И когда пользователь публикует свое решение на этом ресурсе — он должен выбрать, в какую категорию он хочет его добавить. Есть такая категория как “Creative”, где тебе не надо сильно заморачиваться на тему скорости или как легко твое решение читается. Единственная вещь, о который ты должен думать — это на сколько креативное и необычное твое решение.
Это решение как раз из такое категории.
Да, вот и все. Стоит упомянуть, правда, что модуль formater задеприкейтили начиная с версии 3.4 из-за того, что мало кто его использовал. Так что мы скорее всего напишем петицию Гвидо, чтобы оставить этот модуль в Python. Своим ап-вотом за это решение — вы как-бы ставите свою подпись под этой петицией.
«Достаточно элегантно, но не очень по питоновски» от nathan.l.cook
Мы идем дальше и решения становятся тяжелее
Знаете, когда читаешь чье то решение и первые строки, которые ты видишь это:
Ты думаешь: “Ок, тут ща точно будет какая-то магия”
«Немного истории от» от veky (или от …)
Вы можете знать автора этого решения по таким книгам как The Art of Computer Programming, Concrete Mathematics, Surreal Numbers и так далее.
«Эта странная римская математика» от LukeSolo
Довольно часто ты встречаешь решения на CheckiO, и при этом ты даже не представляешь, как они работают:
Но я думаю, что вы разберетесь 🙂
Спасибо
В списке используемых материалов я добавил ссылки на решения CheckiO пользователей, которые использовал в этой статье. Перейдя по ним, вы можете прочитать код-ревью других пользователей либо написать свое.
Это первый раз, когда я пытаюсь поделится такой вот коллекцией наиболее интересных решений на CheckiO. Дайте мне знать, насколько интересно вам о таком читать и на сколько вам нравится сам формат.
Python. Напишите процедуру, которая выводит на экран запись переданного ей числа в римской системе счисления.
Любой массив ты можешь заменить на if — elif — else, перебирающий все индексы массива.
Например, обращение к массиву:
res = [‘I’, ‘II’, ‘III’, ‘IV’, ‘V’, ‘VI’, ‘VII’, ‘VIII’, ‘IX’, ‘X’][val — 1]
ты можешь заменить на:
if val == 1: res = ‘I’
elif val == 2: res = ‘II’
elif val == 3: res = ‘III’
elif val == 4: res = ‘IV’
elif val == 5: res = ‘V’
elif val == 6: res = ‘VI’
elif val == 7: res = ‘VII’
elif val == 8: res = ‘VIII’
elif val == 9: res = ‘IX’
elif val == 10: res = ‘X’
Но делать это придётся тебе самому. Либо оплачивать этот никому не нужный мартышкин труд.
Ох уж это капиталистическое мышление.
Потраченные полчаса, может, денег и стоят, но не настолько же дорого
def roman(n):
####отступ
if n%1 or n<0 or n>4000:return»
s=’M’*(n//1000);k=1000;l=’MDCLXVI’
for i in range(3):n-=n//k*k;k/=10;r=n//k;s+=’%s%s%s’%(l[1+2*i]*(4<r<9),l[2+2*i]*int(r%5-(r%5)//4*3),l[2*i]*(r==9))
return s
#конец отступа