From c990bebd3dffc6d0875f0c46de5df14401a01bcc Mon Sep 17 00:00:00 2001 From: MarcUs7i Date: Thu, 13 Feb 2025 21:58:35 +0100 Subject: [PATCH] finished roman_number.c --- roman_number.c | 107 +++++++++++++------------------------------------ 1 file changed, 27 insertions(+), 80 deletions(-) diff --git a/roman_number.c b/roman_number.c index f9f18e6..ee8eb2a 100755 --- a/roman_number.c +++ b/roman_number.c @@ -29,91 +29,33 @@ static bool rn_is_valid_subtraction(char letter, char next_letter) { } static int roman_char_to_int(char romanNumber) { - switch(romanNumber) { - case 'I': - { - return 1; - } - case 'V': - { - return 5; - } - case 'X': - { - return 10; - } - case 'L': - { - return 50; - } - case 'C': - { - return 100; - } - case 'D': - { - return 500; - } - case 'M': - { - return 1000; - } - default: - { - return 0; - } + const char symbols[] = "IVXLCDM"; + const int values[] = {1, 5, 10, 50, 100, 500, 1000}; + + for(int i = 0; i < 7; i++) { + if(romanNumber == symbols[i]) return values[i]; } + return 0; } -static char int_to_roman_char(int number) { - switch(number) { - case 1: - { - return 'I'; - } - case 5: - { - return 'V'; - } - case 10: - { - return 'X'; - } - case 50: - { - return 'L'; - } - case 100: - { - return 'C'; - } - case 500: - { - return 'D'; - } - case 1000: - { - return 'M'; - } - default: - { - return 0; - } - } -} - -static bool rn_is_valid_number_str(char* string_number) { - if(string_number == 0) { - return 0; +static char* int_to_roman(int number) { + if (number <= 0) { + return ""; } - for(int i = 0; i < strlen(string_number); i++) { - if(roman_char_to_int(string_number[i]) == 0) { - return false; + char* result = (char*)calloc(MAX_ROMAN_NUMBER_COUNT, sizeof(char)); + + const int values[] = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1}; + const char* numerals[] = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"}; + + for (int i = 0; i < 13; i++) { + while (number >= values[i]) { + strcat(result, numerals[i]); + number -= values[i]; } } - - return true; + + return result; } @@ -183,9 +125,14 @@ RomanNumber rn_gcd(RomanNumber x, RomanNumber y) { int intX = rn_get_value(x); int intY = rn_get_value(y); - int result = int_gcd(intX, intY); + if (intX < 0 || intY < 0) { + return 0; + } - return 0; + int result = int_gcd(intX, intY); + char* roman_result = int_to_roman(result); + + return rn_create(roman_result); } int int_gcd(int x, int y) {