В двух глобальных переменных one, two находятся два натуральных числа: первое слагаемое и второе слагаемое. Напишите функцию roman(), которая считает их сумму и записывает ее в глобальную переменную three, переводит каждое слагаемое и сумму в римскую запись и печатает их, как показано в примере.
Формат ввода
one = 5
two = 4
roman()
Формат вывода
V + IV = IX
вот мой код, но вылазит ошибка - Глобальная переменная three не равна сумме one и two
Как исправить?
CONV_TABLE = ((1000, 'M'), (900, 'CM'), (500, 'D'), (400, 'CD'),
(100, 'C'), (90, 'XC'), (50, 'L'), (40, 'XL'),
(10, 'X'), (9, 'IX'), (5, 'V'), (4, 'IV'), (1, 'I'))
def arab_to_roman(number):
if number <= 0:
return ''
ret = ''
for arab, roman in CONV_TABLE:
while number >= arab:
ret += roman
number -= arab
return ret
def roman_to_arab(txt):
txt = txt.upper()
ret = 0
for arab, roman in CONV_TABLE:
while txt.startswith(roman):
ret += arab
txt = txt[len(roman):]
return ret
def roman():
global one
global two
global three
three = '{} + {} = {}'.format(arab_to_roman(one), arab_to_roman(two), arab_to_roman(one + two))
print(three)
// PascalABC.NET 3.0, сборка 1073
const
sb='bcdfgjklmnpqrstvwxz';
s='Computer programming is a process of computer programs creation';
var
i,n:integer;
s1,sn,t:string;
begin
i:=1;
while s[i]<>' ' do Inc(i);
s1:=Copy(s,1,i-1);
n:=Length(s); i:=n;
while s[i]<>' ' do Dec(i);
sn:=Copy(s,i+1,n-i);
t:='';
for i:=1 to Length(s1) do
if Pos(s1[i],sb)>0 then t:=t+s1[i];
s1:=t;
t:='';
for i:=1 to Length(sn) do
if Pos(sn[i],sb)>0 then t:=t+sn[i];
sn:=t;
t:='';
for i:=1 to Length(s1) do
if Pos(s1[i],sn)>0 then
if Pos(s1[i],t)=0 then t:=t+s1[i];
for i:=1 to Length(t) do Write(t[i],' ');
Writeln
end.
Тестовый прогон:
t r
2. "Нормальное" решение
// PascalABC.NET 3.0, сборка 1073
const
sb='bcdfgjklmnpqrstvwxz';
s='Computer programming is a process of computer programs creation';
begin
var a:=s.ToWords(' ');
a[0].Intersect(a[a.Length-1]).Where(x->Pos(x,sb)>0).Println(',')
end.
Тестовый прогон:
t,r
16
Объяснение:
1. Алфавит мощностью 26 символов требует для кодирования символа 5 бит (2⁴ < 26 < 2⁵). 22 символа займут 22×5 = 110 бит = 110 / 8 = 13.75 байта, округляем до целого вверх, получаем 14 байт.
2. Номер года обозначается одним из 100 чисел. 2⁶ < 100 > 2⁷, поэтому для кодирования требуется 7 бит.
3. Номер для обозначается одним из 366 чисел. 2⁸ < 366 > 2⁹, поэтому для кодирования требуется 9 бит.
4. Всего для кодирования срока действия потребуется 7+9 = 16 бит = 16/2 = 2 байта
5. Вся информация на пропуске займет 14+2 = 16 байт