summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--snc.c25
-rw-r--r--snc.h4
2 files changed, 28 insertions, 1 deletions
diff --git a/snc.c b/snc.c
index d42dce2..818bc78 100644
--- a/snc.c
+++ b/snc.c
@@ -18,6 +18,8 @@
***/
#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
#include "snc.h"
@@ -80,6 +82,29 @@ int romanToArabic(char *str)
return answer;
}
+char *arabicToRoman(char *str)
+{
+ int number = atoi(str);
+ if(!number || number > SNC_ROMAN_MAX_NUMBER)
+ return NULL;
+
+ const char *units[] = {"","I","II","III","IV",
+ "V","VI","VII","VIII","IV"};
+ const char *tens[] = {"","X","XX","XXX","XL",
+ "L","LX","LXX","LXXX","XC"};
+ const char *hundreds[] = {"","C","CC","CCC","CD",
+ "D","DC","DCC","DCCC","CM"};
+ const char *thousands[] = {"","M","MM","MMM"};
+ char *answer = malloc(sizeof(char) * (SNC_ROMAN_MAXLEN + 1));
+
+ strcpy(answer, thousands[number / 1000]);
+ strcat(answer, hundreds[number / 100 % 10]);
+ strcat(answer, tens[number / 10 % 10]);
+ strcat(answer, units[number % 10]);
+
+ return answer;
+}
+
int main(int argc, char *argv[])
{
if(argc < 2)
diff --git a/snc.h b/snc.h
index b100151..9b02b51 100644
--- a/snc.h
+++ b/snc.h
@@ -27,7 +27,9 @@ enum {
SNC_ROMAN_L = 50,
SNC_ROMAN_C = 100,
SNC_ROMAN_D = 500,
- SNC_ROMAN_M = 1000
+ SNC_ROMAN_M = 1000,
+ SNC_ROMAN_MAX_NUMBER = 3999,
+ SNC_ROMAN_MAXLEN = 15 // MMMDCCCLXXXVIII
};
#endif /* SNC_NUMBERS_H */