((http://server.179.ru/olymp/2008/statements/e.html Условия задачи пятого тура))
Идея решения. В глобальной переменной Roman записана строка - римское число, в переменной Arabic - ее числовое значение. Первоналально оно равно нулю, в ходе разбора это значение будет увеличиваться. Переменная Position хранит количество уже успешно считанных и разобранных символов из переменной Roman.
Основная функция - это функция Read. Она получает два параметра: строку, соответствующую одной группе символов, которые считываются из переменной Roman и их числовое значение. Например, вызов Read("IX",9) - это попытка считать из переменной Roman последовательность символов "IX".
Считывание символов производится начиная с позиции Position. Считывание успешным, если строка Roman после пропуска первых Position символов совпадает с группой. Если считывание было успешным, то к значению Arabic прибавляется числовое значение группы (второй паараметр функции Read), а значение Position увеличивается на значение длины группы и функция Read возвращает true. Если считывание неуспешно, фунция Read возвращает false.
В функции main считывается значение Roman, далее осуществляется разбор строки. При этом используется особенность неполного вычисления логических выражений, например, при вызове Read("MMM", 3000) || Read("MM", 2000) || Read("M", 1000) сначала вызывается функция Read("MMM", 3000). Если она вернула true, то две другие функции не вызываются, а если вернула false, то вызывается Read("MM", 2000). В свою очередь, Read("M", 1000) вызывается только если два предыдущих вызова вернули false.
В функции main осуществляются последовательные попытки считать количество тысяч, сотен, десятков и единиц. Если после этого были считаны все символы, значит, запись римского числа корректна и выводится значение Arabic, иначе (остались несчитанные символы) запись некорректна и выводится 0.