Правило а) в конец числа (справа) дописывается 1, если число единиц в двоичной записи числа чётно, и 0, если число единиц в двоичной записи числа нечётно. Правило а) приведет к тому, что число единиц станет нечетным в любом случае.
Правило б) к этой записи справа дописывается остаток от деления количества единиц на 2. После правила а) число единиц нечетное, поэтому дописываться всегда будет единица. Это, в свою очередь, означает, что все число будет нечетным и в десятичной системе, а общее число единиц в двоичной записи будет четным.
Число R по условию превышает 31₁₀=11111₂ и должно быть нечетным.
Будем последовательно проверять все нечетные числа, начиная от 100001₂.
100001 может быть результатом работы алгоритма, т.е. число единиц в нем четное и оно завершается единицей.
В самом деле, если N₂=1000, то по правилу а) получаем 10000, а по правилу б) получаем 100001.
*** этот файл мы должны назвать nekkit20.pas *** *** после его компиляции будет создан модуль ***
unit nekkit20;
type tra=(string,integer);
function RomeToArab(s:string):integer; // Перевод римских чисел (не больших MMMCMXCIX) в арабские begin var ar:='IVXLCDM'; var aa:=Arr(1,5,10,50,100,500,1000); var n:=0; Result:=0; foreach var c in s do begin var c1:=n; n:=aa[Pos(c,ar)-1]; Result+=n+(n>c1?-2*c1:0) end; end;
function Equal(r:array of string; a:array of integer):sequence of tra; // Возвращает последовательность кортежей // из массива римских чисел (массив r), // для которых есть соответствие в массиве арабских чисел (массив a) begin foreach var q in r do begin var n:=RomeToArab(q); if a.IndexOf(n)>-1 then yield((q,n)) end end;
end.
*** а это другой файл с любым именем, кроме nekkit20 *** *** он обращается к молулю nekkit20 ***
uses nekkit20;
begin var sr:=Arr('DXVIII','LXIII','MII','XIV','LXXXVIII','CXCVI'); var ar:=Arr(14,98,196,1002,518,64,87); var R:=Equal(sr,ar); if R.Count=-1 then Writeln('Нет совпадений') else foreach var t in R do Writeln(t[0],' = ',t[1]) end.
Правило а) в конец числа (справа) дописывается 1, если число единиц в двоичной записи числа чётно, и 0, если число единиц в двоичной записи числа нечётно. Правило а) приведет к тому, что число единиц станет нечетным в любом случае.
Правило б) к этой записи справа дописывается остаток от деления количества единиц на 2. После правила а) число единиц нечетное, поэтому дописываться всегда будет единица. Это, в свою очередь, означает, что все число будет нечетным и в десятичной системе, а общее число единиц в двоичной записи будет четным.
Число R по условию превышает 31₁₀=11111₂ и должно быть нечетным.
Будем последовательно проверять все нечетные числа, начиная от 100001₂.
100001 может быть результатом работы алгоритма, т.е. число единиц в нем четное и оно завершается единицей.
В самом деле, если N₂=1000, то по правилу а) получаем 10000, а по правилу б) получаем 100001.
Итак, N₂=100001₂=2⁵+2⁰=32+1=33₁₀
ответ: 33
*** этот файл мы должны назвать nekkit20.pas ***
*** после его компиляции будет создан модуль ***
unit nekkit20;
type
tra=(string,integer);
function RomeToArab(s:string):integer;
// Перевод римских чисел (не больших MMMCMXCIX) в арабские
begin
var ar:='IVXLCDM';
var aa:=Arr(1,5,10,50,100,500,1000);
var n:=0;
Result:=0;
foreach var c in s do
begin
var c1:=n;
n:=aa[Pos(c,ar)-1];
Result+=n+(n>c1?-2*c1:0)
end;
end;
function Equal(r:array of string; a:array of integer):sequence of tra;
// Возвращает последовательность кортежей
// из массива римских чисел (массив r),
// для которых есть соответствие в массиве арабских чисел (массив a)
begin
foreach var q in r do
begin
var n:=RomeToArab(q);
if a.IndexOf(n)>-1 then yield((q,n))
end
end;
end.
*** а это другой файл с любым именем, кроме nekkit20 ***
*** он обращается к молулю nekkit20 ***
uses nekkit20;
begin
var sr:=Arr('DXVIII','LXIII','MII','XIV','LXXXVIII','CXCVI');
var ar:=Arr(14,98,196,1002,518,64,87);
var R:=Equal(sr,ar);
if R.Count=-1 then Writeln('Нет совпадений')
else
foreach var t in R do
Writeln(t[0],' = ',t[1])
end.
*** Контрольный пример ***
DXVIII = 518
MII = 1002
XIV = 14
CXCVI = 196