Перевод римских чисел в арабские - C#
Формулировка задачи:
Добрый вечер. Вот такое у меня небольшое задание:
При вводе одного римского числа пользователем всё работало прекрасно. Но когда я попытался ввести цикл для нескольких чисел, перестал работать ToCharArray.
Перед вами стоит задача конвертации числа из римской системы счисления в десятичную.
Все числа в рамках вашего проекта можно записать с помощью 7 цифр:
I = 1
V = 5
X = 10
L = 50
C = 100
D = 500
M = 1000
Натуральные числа записываются при помощи повторения этих цифр. При этом, если большая цифра стоит перед меньшей, либо равной, то они складываются, если же меньшая — перед большей, то меньшая вычитается из большей.
Входные данные.
В первой строке написано число N(1<=N<=100) – количество римских чисел, которые нужно конвертировать. В последующих N строках записаны сами римские числа, по одной в каждой строке.
Выходные данные.
Необходимо вывести N чисел в десятичной системе счисления, которые являются результатом конвертации входных римских чисел. Порядок следования десятичных чисел должен соответствовать порядку следования соответствующих римских чисел. Гарантируется, что конвертированное число находится в интервале [1,1000]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace roman_numbers
{
class Program
{
static void Main(string[] args)
{
int N = Convert.ToInt32(File.ReadLines("input.txt").Skip(0).First());
string[] Roman = new string[N];
for (int i = 0; i < N; i++)
{
Roman[i] = File.ReadLines("input.txt").Skip(i + 1).First();
char[] ch = new char[Roman[i].Length];
ch = Roman[i].ToCharArray;
int[] Znach = new int[Roman[i].Length];
int[] Arab = new int[N];
for (int j = 0; j < ch.Length; j++)
{
Arab[i] = 0;
if (ch[j] == 'I')
{
Znach[j] = 1;
}
if (ch[j] == 'V')
{
Znach[j] = 5;
}
if (ch[j] == 'X')
{
Znach[j] = 10;
}
if (ch[j] == 'L')
{
Znach[j] = 50;
}
if (ch[j] == 'C')
{
Znach[j] = 100;
}
if (ch[j] == 'D')
{
Znach[j] = 500;
}
if (ch[j] == 'M')
{
Znach[j] = 1000;
}
Arab[i] = Arab[i] + Znach[j];
}
for (int j = 0; j < ch.Length - 1; j++)
{
if (Znach[j] < Znach[j + 1])
{
Arab[i] = Arab[i] - 2 * Znach[j];
}
}
StreamWriter str = new StreamWriter("output.txt");
for (int k = 0; k < N; k++)
{
str.WriteLine(Arab[i]);
}
str.Close();
}
}
}
}Решение задачи: «Перевод римских чисел в арабские»
textual
Листинг программы
using System;
using System.Collections.Generic;
namespace RomanNumeralsTest
{
public static class RomanNumerals
{
private static readonly Dictionary<char, int> romanDigits =
new Dictionary<char, int> {
{ 'I', 1 },
{ 'V', 5 },
{ 'X', 10 },
{ 'L', 50 },
{ 'C', 100 },
{ 'D', 500 },
{ 'M', 1000 }
};
public static int Decode(string s)
{
int total = 0;
int prev = 0;
foreach( char c in s ) {
int curr = romanDigits[c];
total += curr < prev ? -curr : curr;
prev = curr;
}
return total;
}
}
class Program
{
static void Main(string[] args)
{
foreach( string s in args )
{
Console.WriteLine(RomanNumerals.Decode(s));
}
}
}
}