SHOW:
|
|
- or go back to the newest paste.
1 | class RomanNumber | |
2 | { | |
3 | /// <summary> | |
4 | /// The possible characters used to represent a single digit in a Roman number. | |
5 | /// Example: For tens digit, Ten = C (100), Five = L (50), One = X (10) | |
6 | /// </summary> | |
7 | class RomanDigit | |
8 | { | |
9 | public char Ten { get; set; } | |
10 | public char Five { get; set; } | |
11 | public char One { get; set; } | |
12 | } | |
13 | ||
14 | #region Constants | |
15 | static List<RomanDigit> RomanDigits = new List<RomanDigit>() | |
16 | { | |
17 | new RomanDigit() {Ten = 'X', Five = 'V', One = 'I'}, // Ones place | |
18 | new RomanDigit() {Ten = 'C', Five = 'L', One = 'X'}, // Tens place | |
19 | new RomanDigit() {Ten = 'M', Five = 'D', One = 'C'}, // Hundreds place | |
20 | new RomanDigit() {One = 'M'}, // Thousands place | |
21 | }; | |
22 | static int MAX = 3999; | |
23 | static int MIN = 0; | |
24 | #endregion | |
25 | ||
26 | /// <summary> | |
27 | /// Converts an Arabic number to a Roman number by converting one digit at a time. | |
28 | /// </summary> | |
29 | /// <param name="arabic"></param> | |
30 | /// <returns></returns> | |
31 | public static string ToRoman(int arabic) | |
32 | { | |
33 | if (arabic > MAX || arabic < MIN) throw new ArgumentOutOfRangeException("Arabic number must between 0 and 3999."); | |
34 | string roman = ""; | |
35 | ||
36 | int decimalPlace = 0; // Start at 10^0 (ones place) | |
37 | while (arabic > 0) | |
38 | { | |
39 | // Get lowest digit | |
40 | int currentDigit = arabic % 10; | |
41 | ||
42 | // Add converted string to output | |
43 | RomanDigit digit = RomanDigits[decimalPlace]; | |
44 | - | if (currentDigit % 5 == 4) // Special case for 4 and 9 |
44 | + | if (currentDigit % 5 == 4) // Special case for 4 and 9, print "One" followed by "Five" or "Ten". |
45 | roman = string.Format("{0}{1}", digit.One, (currentDigit == 9) ? digit.Ten : digit.Five) + roman; | |
46 | - | else |
46 | + | else // If currentDigit > 5, print "Five". Then print "One" several times until done. |
47 | roman = string.Format("{0}{1}", (currentDigit >= 5) ? digit.Five.ToString() : "", new String(digit.One, currentDigit % 5)) + roman; | |
48 | ||
49 | // Next loop iteration | |
50 | - | arabic /= 10; |
50 | + | arabic /= 10; // Divide by 10 to get next digit |
51 | - | decimalPlace++; |
51 | + | decimalPlace++; // Go to next RomanDigit |
52 | } | |
53 | ||
54 | return roman; | |
55 | } | |
56 | } |