using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace RomanDigits
{
class RomanNumeralConverter
{
// Way one
private struct RomanDigit
{
public string Rstr;
public int value;
}
private RomanDigit[] Rom;
// Way two
private Dictionary<string, int> Roman;
// Way three
private List<Tuple<string, int>> ConvTable = new List<Tuple<string, int>>();
public RomanNumeralConverter() //construct and init the 3 types
{
Rom = new RomanDigit[]
{
new RomanDigit{Rstr = "M", value = 1000},
new RomanDigit{Rstr = "CM", value = 900},
new RomanDigit{Rstr = "D", value = 500},
new RomanDigit{Rstr = "CD", value = 400},
new RomanDigit{Rstr = "C", value = 100},
new RomanDigit{Rstr = "XC", value = 90},
new RomanDigit{Rstr = "L", value = 50},
new RomanDigit{Rstr = "XL", value = 40},
new RomanDigit{Rstr = "X", value = 10},
new RomanDigit{Rstr = "IX", value = 9},
new RomanDigit{Rstr = "V", value = 5},
new RomanDigit{Rstr = "IV", value = 4},
new RomanDigit{Rstr = "I", value = 1},
};
Roman = new Dictionary<string, int>();
Roman.Add("M", 1000);
Roman.Add("CM", 900);
Roman.Add("D", 500);
Roman.Add("CD", 400);
Roman.Add("C", 100);
Roman.Add("XC", 90);
Roman.Add("L", 50);
Roman.Add("XL", 40);
Roman.Add("X", 10);
Roman.Add("IX", 9);
Roman.Add("V", 5);
Roman.Add("IV", 4);
Roman.Add("I", 1);
ConvTable = new List<Tuple<string, int>>();
ConvTable.Add(Tuple.Create("M", 1000));
ConvTable.Add(Tuple.Create("CM", 900));
ConvTable.Add(Tuple.Create("D", 500));
ConvTable.Add(Tuple.Create("CD", 400));
ConvTable.Add(Tuple.Create("C", 100));
ConvTable.Add(Tuple.Create("XC", 90));
ConvTable.Add(Tuple.Create("L", 50));
ConvTable.Add(Tuple.Create("XL", 40));
ConvTable.Add(Tuple.Create("X", 10));
ConvTable.Add(Tuple.Create("IX", 9));
ConvTable.Add(Tuple.Create("V", 5));
ConvTable.Add(Tuple.Create("IV", 4));
ConvTable.Add(Tuple.Create("I", 1));
}
public string ConvertwithStruct(int Number)
{
string RomanStr = string.Empty;
for (int i = 0; Number > 0; i++)
{
while (Rom[i].value <= Number)
{
RomanStr += Rom[i].Rstr;
Number -= Rom[i].value;
}
}
return RomanStr;
}
public string ConvertwithDict(int Number)
{
string RomanStr = string.Empty;
for (int i = 0; Number > 0; i++)
{
while (Roman.ElementAt(i).Value <= Number)
{
RomanStr += Roman.ElementAt(i).Key;
Number -= Roman.ElementAt(i).Value;
}
}
return RomanStr;
}
public string ConvertwithTuple(int Number)
{
string RomanStr = string.Empty;
for (int i = 0; Number > 0; i++)
{
while (ConvTable.ElementAt(i).Item2 <= Number)
{
RomanStr += ConvTable.ElementAt(i).Item1;
Number -= ConvTable.ElementAt(i).Item2;
}
}
return RomanStr;
}
}
}
///////Program to test this class
using System;
using System.Collections.Generic;
using System.Linq;
namespace RomanDigits
{
class Program
{
static void Main(string[] args)
{
RomanNumeralConverter RC = new RomanNumeralConverter();
string RomanNumeral = string.Empty;
int DecimalNumber = 1984;
RomanNumeral = RC.ConvertwithStruct(DecimalNumber);
Console.WriteLine("The integer {0} is {1} in roman.", DecimalNumber, RomanNumeral);
DecimalNumber = 1999;
RomanNumeral = RC.ConvertwithDict(DecimalNumber);
Console.WriteLine("The integer {0} is {1} in roman.", DecimalNumber, RomanNumeral);
DecimalNumber = 42;
RomanNumeral = RC.ConvertwithTuple(DecimalNumber);
Console.WriteLine("The integer {0} is {1} in roman.", DecimalNumber, RomanNumeral);
Console.ReadKey();
}
}
}