2014-09-16 7 views
-2

Я знаю, как это сделать, и сделал программу, которая делает это в прошлом, однако она никогда не включала особые случаи римских цифр (например, IV = 4). Интеграция этого в функциональную программу минималистским образом - моя главная проблема. Есть ли хороший способ сделать это?C++: преобразование десятичной в римскую цифру

+2

Если вы знаете [как читать их] (http://en.wikipedia.org/wiki/Roman_numerals#Reading_Roman_numerals), их также должно быть легко создать. Это просто деление, по модулю и в цикле строка, связывающая определенные строки с другой строкой. –

+0

Ну да, но что такое пример? Я знаю, как читать им, просто трудно применить особые случаи. Я, вероятно, просто переусердствовал, но я просто хотел бы знать, что делать. Какова была ваша реализация, если я могу спросить @JoachimPileborg? – T145

+0

Используя таблицу всех одно- и двухзначных цифр и их значений, вы можете искать от M (1000) до I (1) для первого значения> = значение, которое вы хотите преобразовать. Соедините эту строку с результатом и вычтите соответствующее значение. Повторение. – molbdnilo

ответ

1

очень простое решение, в псевдо-коде, может выглядеть примерно так:

value = get_the_value_to_convert(); 
divider = 1000; // Start at 1000 (M) 

while (value > 0) 
{ 
    count = value/divider; 
    value = value % divider; 

    for (i = 0; i < count; ++i) 
     print(roman_numeral_from_number(divider)); 

    divider /= 10; 
} 

roman_numeral_from_numbe функция делает отображение взаимно-однозначное соответствие между номером и римской цифрой.

См., Например, 5432 как ввод будет печать MMMMMCCCCXXXII.

Для получения лучших результатов разделите переменную divider на 2 и 5 каждый второй раз.

Для получения лучших результатов добавьте чек для определенных номеров, например 90, равный "XC".

Обратите внимание, что даже с изменениями вышеприведенный алгоритм не может обрабатывать очень большие числа, но, с другой стороны, Wikipedia утверждает, что исторически он использовался только для небольших чисел.

+0

Awesome большое спасибо! Для метода «roman_numeral_from_number» это выглядело бы как 'value> = 1000? roman_year + = "M": ... '? – T145

+0

Кроме того, вы даже не используете эту переменную 'i' в цикле, поэтому вам технически даже не нужен оператор цикла или переменная count. – T145

 Смежные вопросы

  • Нет связанных вопросов^_^