finished roman_number.c
This commit is contained in:
parent
cd789112d7
commit
c990bebd3d
1 changed files with 27 additions and 80 deletions
105
roman_number.c
105
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) {
|
static int roman_char_to_int(char romanNumber) {
|
||||||
switch(romanNumber) {
|
const char symbols[] = "IVXLCDM";
|
||||||
case 'I':
|
const int values[] = {1, 5, 10, 50, 100, 500, 1000};
|
||||||
{
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static char int_to_roman_char(int number) {
|
for(int i = 0; i < 7; i++) {
|
||||||
switch(number) {
|
if(romanNumber == symbols[i]) return values[i];
|
||||||
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
for(int i = 0; i < strlen(string_number); i++) {
|
static char* int_to_roman(int number) {
|
||||||
if(roman_char_to_int(string_number[i]) == 0) {
|
if (number <= 0) {
|
||||||
return false;
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
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,11 +125,16 @@ RomanNumber rn_gcd(RomanNumber x, RomanNumber y) {
|
||||||
int intX = rn_get_value(x);
|
int intX = rn_get_value(x);
|
||||||
int intY = rn_get_value(y);
|
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) {
|
int int_gcd(int x, int y) {
|
||||||
if(y == 0) {
|
if(y == 0) {
|
||||||
return x;
|
return x;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue