0 / 0 / 0
Регистрация: 11.11.2019
Сообщений: 24

Преобразование чисел, записанных в римской нумерации, в десятичную систему счисления

08.01.2020, 21:00. Показов 7928. Ответов 17

Студворк — интернет-сервис помощи студентам
Составить программу преобразования натуральных чисел, записанных в римской нумерации, в десятичную систему счисления.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.01.2020, 21:00
Ответы с готовыми решениями:

Посчитать сумму двух натуральных чисел, записанных в римской системе счисления
Посчитать сумму двух натуральных чисел А и В, записанных в римской системе счисления. Ответ также записать в римской системе счисления. ...

Перевод целых чисел в десятичную систему счисления
Перевод целых чисел q -> 10.Дано целое число в системе счисления с основанием q, 2 ≤ q ≤ 16. Найти его значение в 10-чной...

Перевод из двоичной в десятичную систему счисления
Пытаюсь сделать рекурсивный перевод в 10ую СС на C#, если передаю строку а-ля: Console.Write(ToDecimal("1011",2) возвращает...

17
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
08.01.2020, 22:44
Как то так, если ничего не напутал в римских цифрах по памяти.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using System;
using System.Collections.Generic;
using System.Linq;
 
class Program
{
    static void Main()
    {
        Dictionary<int, string> d = new Dictionary<int, string>()
        {
            { 900, "CM" }, { 1000, "M" }, { 400, "CD" }, { 90, "XC" }, { 100, "C" },
            { 40, "XL" }, { 50, "L" }, { 9, "IX" }, { 10, "X" }, { 4, "IV" }, { 5, "V" }, { 1, "I" }
        };
 
        string s = Console.ReadLine();
        Console.WriteLine(d.Sum(x => (s.Length - (s = s.Replace(x.Value, "")).Length) / x.Value.Length * x.Key));
 
        Console.ReadKey();
    }
}
1
 Аватар для Enifan
1849 / 1192 / 501
Регистрация: 14.10.2018
Сообщений: 3,225
08.01.2020, 22:58
Цитата Сообщение от QuakerRUS Посмотреть сообщение
если ничего не напутал в римских цифрах по памяти
можно воспользоваться таблицей Юникода

Добавлено через 1 минуту
К сожалению ваш вариант неверный.
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
08.01.2020, 22:59
Цитата Сообщение от Enifan Посмотреть сообщение
К сожалению ваш вариант неверный.
В чем?
0
 Аватар для Enifan
1849 / 1192 / 501
Регистрация: 14.10.2018
Сообщений: 3,225
08.01.2020, 23:01
Цитата Сообщение от QuakerRUS Посмотреть сообщение
В чем?
строка "VM" выдает 1005, а должно 995
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
08.01.2020, 23:02
Enifan, 995 = CMXCV, VM - это некорректная запись.
0
 Аватар для Enifan
1849 / 1192 / 501
Регистрация: 14.10.2018
Сообщений: 3,225
08.01.2020, 23:09
Цитата Сообщение от QuakerRUS Посмотреть сообщение
VM - это некорректная запись
хм и правда, значит плохой из меня конвертер. Оказывается минусовать можно только I и X
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
08.01.2020, 23:10
Цитата Сообщение от Enifan Посмотреть сообщение
минусовать можно только I и X
Не совсем. Есть определенные числа по типу 4, 9, 40, 90, 400, 900. Их можно увидеть в моем Dictionary. То есть, к примеру, IL тоже будет некорректной записью.
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16150 / 11271 / 2890
Регистрация: 21.04.2018
Сообщений: 33,142
Записей в блоге: 2
08.01.2020, 23:57
Цитата Сообщение от Enifan Посмотреть сообщение
хм и правда, значит плохой из меня конвертер. Оказывается минусовать можно только I и X
Цитата Сообщение от QuakerRUS Посмотреть сообщение
Не совсем. Есть определенные числа по типу 4, 9, 40, 90, 400, 900. Их можно увидеть в моем Dictionary. То есть, к примеру, IL тоже будет некорректной записью.
Цитата из ВикиОднако, в наши дни в некоторых случаях используется и упрощенная запись римских чисел: например, в программе Microsoft Excel при преобразовании арабских цифр в римские при помощи функции «РИМСКОЕ()» можно использовать несколько видов представления чисел, от классического до сильно упрощенного (так, число 499 может быть записано как CDXCIX, LDVLIV, XDIX, VDIV или ID). Упрощение состоит в том, что для уменьшения какой-либо цифры слева от неё может писаться любая другая цифра:
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
09.01.2020, 00:29
Элд Хасп, Excel не показатель. Там можно написать хоть =ARABIC("IIIIIIIIIIIIIIIIIIII") и он напишет 20. Будем считать, что у меня строгая форма записи. Описание можно найти, например, тут.
https://ru.wikipedia.org/wiki/Римские_цифры

Добавлено через 9 минут
В моем коде, кстати, пропущена { 500, "D" }, , ее надо добавить после { 400, "CD" }, .
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16150 / 11271 / 2890
Регистрация: 21.04.2018
Сообщений: 33,142
Записей в блоге: 2
09.01.2020, 00:38
Цитата Сообщение от QuakerRUS Посмотреть сообщение
Описание можно найти, например, тут.
https://ru.wikipedia.org/wiki/Римские_цифры
Так я вам оттуда и дал цитату.
Ещё одна оттуда же

ЦитатаСлучаи такой записи чисел (как правило, годов) часто встречаются в титрах телесериалов США. Например, для года 1998: IIMM вместо MCMXCVIII.
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
09.01.2020, 01:41
Элд Хасп, уговорили, вот код для любых извращений)

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
using System;
using System.Collections.Generic;
using System.Linq;
 
class Program
{
    static void Main()
    {
        Dictionary<char, int> d = new Dictionary<char, int>()
        {
            { 'I', 1 }, { 'V', 5 }, { 'X', 10 }, { 'L', 50 }, { 'C', 100 }, { 'D', 500 }, { 'M', 1000 }
        };
 
        string s = Console.ReadLine().ToUpper();
        Console.WriteLine(s.Select((x, i) => d[x] * (i < s.LastIndexOfAny(s.Distinct().Where(y => d[x] < d[y]).ToArray()) ? -1 : 1)).Sum());
 
        Console.ReadKey();
    }
}
2
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16150 / 11271 / 2890
Регистрация: 21.04.2018
Сообщений: 33,142
Записей в блоге: 2
09.01.2020, 02:01
Цитата Сообщение от QuakerRUS Посмотреть сообщение
уговорили, вот код для любых извращений)
Ой, блин!
Не зарекайтесь!
Я ещё тот извращенец!


По условию задачиЖ натуральных чисел, записанных в римской нумерации.
НО! Нигде нет условия, что запись будет только латинскими буквами!
Как уже написал Enifan, в Юникоде есть специальные символы для обозначения римских цифр.
И вы никак это не обрабатываете!

Ниже цифры в римской нумерации, но не в латинском алфавите:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
Ⅰ
Ⅱ
Ⅲ
Ⅳ
Ⅴ
Ⅵ
Ⅶ
Ⅷ
Ⅸ
Ⅹ
Ⅺ
Ⅻ
Ⅼ
Ⅽ
Ⅾ
Ⅿ
ↀ
ↁ
ↂ
ↇ
ↈ
ⅰ
ⅱ
ⅲ
ⅳ
ⅴ
ⅵ
ⅶ
ⅷ
ⅸ
ⅹ
ⅺ
ⅻ
ⅼ
ⅽ
ⅾ
ⅿ
ↅ
ↆ
Ↄ
1
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
09.01.2020, 02:22
Элд Хасп, ок, почти любых) да и программа консольная, там эти символы и не отобразятся. Такое извращение имеет место разве что для GUI, и то такое обычно обговаривается в ТЗ.

Добавлено через 2 минуты
Элд Хасп, при желании символы добавить в словарь недолго, сам код менять не придется.

Добавлено через 7 минут
Элд Хасп, хотя возможны и небольшие косяки, например для ⅸX. Но тут можно такие символы (из нескольких цифр) просто реплейсом обработать перед основным кодом.

Добавлено через 6 минут
Элд Хасп, ну и, конечно же, у меня не учитывается работа с очень большими числами, так как, как правило, римские цифры используются для указания года.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
09.01.2020, 09:55
QuakerRUS, а зачем вам словарь, если вы не пользуетесь его функционалом?
Используйте лучше массив кортежей — он по крайней мере гарантирует порядок элементов, в отличие от словаря.
1
 Аватар для andrey_f
884 / 537 / 228
Регистрация: 21.02.2011
Сообщений: 5,705
09.01.2020, 10:24
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
using System;
using System.Collections.Generic;
 
public class RomanDecode
{
  private static IDictionary<string, int> _translator = new Dictionary<string, int>
        {
            {"M", 1000}, {"CM", 900}, {"D", 500}, {"CD", 400}, {"C", 100}, {"XC", 90}, 
            {"L", 50}, {"XL", 40}, {"X", 10}, {"IX", 9}, {"V", 5}, {"IV", 4}, {"I", 1}
        };
 
    public static int Solution(string roman)
    {
        var total = 0;
        foreach (var item in _translator)
        {
            while (roman.IndexOf(item.Key) == 0)
            {
                total += item.Value;
                roman = roman.Remove(0, item.Key.Length);
            }
        }
 
        return total;
    }
}
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
09.01.2020, 12:31
Цитата Сообщение от kolorotur Посмотреть сообщение
Используйте лучше массив кортежей
Спасибо за совет! Я как раз раздумывал как лучше хранить несколько значений вместе, не создавая структуры в стиле C++, и совсем забыл про кортежи. Правда это замечание подходит для первоначальной моей программы. Ее код поправил. С вашей точки зрения, стоит ли что то поправить в оформлении кортежей? Может есть какая то более распространенная стилистика.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
using System;
using System.Linq;
 
class Program
{
    static void Main()
    {
        var d = new (int n, string s)[]
        {
            (900, "CM"), (1000, "M"), (400, "CD"), (500, "D"), (90, "XC"), (100, "C"),
            (40, "XL"), (50, "L"), (9, "IX"), (10, "X"), (4, "IV"), (5, "V"), (1, "I")
        };
 
        string s = Console.ReadLine();
        Console.WriteLine(d.Sum(x => (s.Length - (s = s.Replace(x.s, "")).Length) / x.s.Length * x.n));
 
        Console.ReadKey();
    }
}
1
10 / 7 / 3
Регистрация: 12.09.2021
Сообщений: 78
24.07.2022, 18:13
Так лучше и работает)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
using System;
using System.Collections.Generic;
 
namespace ParsingRomanNumerals
{
    internal class Program
    {
        private static Dictionary<char, int> map = new Dictionary<char, int>()
        {
            {'I', 1 },
            {'V', 5 },
            {'X', 10 },
            {'L', 50 },
            {'C', 100 },
            {'D', 500 },
            {'M', 1000 }
        };
        public static int Parse(string roman)
        {
            int result = 0;
            for(int i=0; i<roman.Length; i++)
            {
                if(i+1 < roman.Length && IsSubtractive(roman[i], roman[i+1]))
                {
                    result -= map[roman[i]];
                }
                else
                {
                    result += map[roman[i]];
                }
            }
            return result;
        }
        private static bool IsSubtractive(char c1, char c2)
        {
            return map[c1]  < map[c2];
        }
        static void Main(string[] args)
        {
            int arabicNumber;
            Console.Write("Enter roman number: ");
            string roman=Console.ReadLine();
            arabicNumber = Parse(roman);
            Console.WriteLine("Arabic number - " + arabicNumber);
            
 
        }
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.07.2022, 18:13
Помогаю со студенческими работами здесь

Перевод из четверичной в десятичную систему счисления
Мне нужно сделать так: 123 = (1*4 в степени 2) + (2*4 в степени 1) + (3*4 в степени 0) = 27 private void...

Перевод символьной строки в десятичную систему счисления
Дана символьная строка,представляющая собой запись натурального числа в ричной системе счисления(2&lt;=p&lt;=9).Перевисти это число в...

Рекурсивный метод перевода в десятичную систему счисления
задачу решить рекурсивным методом.Дана символьная строка,представляющая собой запись натурального числа в ричной системе...

Перевод числа в десятичную систему счисления: исправить код
есть скажем число A9B из системы исчисления D. Хотим мы это число перевести в 10 систему. Должно получиться 11+117+1690=1718 а получается...

Перевести число из системы с основанием N в десятичную систему счисления
Вводится строка и число N (от 2 до 36). Строка - это запись числа в системе счисления с основанием N (для цифр берутся десятичные...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

Новые блоги и статьи
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru