Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/36: Рейтинг темы: голосов - 36, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 11.11.2019
Сообщений: 24

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

08.01.2020, 21:00. Показов 7904. Ответов 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 / 1191 / 501
Регистрация: 14.10.2018
Сообщений: 3,211
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 / 1191 / 501
Регистрация: 14.10.2018
Сообщений: 3,211
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 / 1191 / 501
Регистрация: 14.10.2018
Сообщений: 3,211
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
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,111
Записей в блоге: 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
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,111
Записей в блоге: 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
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,111
Записей в блоге: 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 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru