summaryrefslogtreecommitdiff
path: root/0012
diff options
context:
space:
mode:
Diffstat (limited to '0012')
-rw-r--r--0012/main.c57
1 files changed, 57 insertions, 0 deletions
diff --git a/0012/main.c b/0012/main.c
new file mode 100644
index 0000000..13c2c96
--- /dev/null
+++ b/0012/main.c
@@ -0,0 +1,57 @@
+#include "stdlib.h"
+#include "string.h"
+#include "stdio.h"
+
+typedef struct {
+ int value;
+ char *symbol;
+} SymTableEntry;
+
+SymTableEntry sym_table[] = {
+ {1000, "M"},
+ {900, "CM"},
+ {500, "D"},
+ {400, "CD"},
+ {100, "C"},
+ {90, "XC"},
+ {50, "L"},
+ {40, "XL"},
+ {10, "X"},
+ {9, "IX"},
+ {5, "V"},
+ {4, "IV"},
+ {1, "I"},
+ {-1, NULL},
+};
+
+char *concat(char *prev, char *sym) {
+ int prevlen = strlen(prev);
+ int symlen = strlen(sym);
+ char *res = malloc(prevlen + symlen + 1);
+ memcpy(res, prev, prevlen);
+ memcpy(res + prevlen, sym, symlen);
+ res[prevlen + symlen] = '\0';
+ free(prev);
+ return res;
+}
+
+char* intToRoman(int num) {
+ char *r = malloc(1);
+ r[0] = '\0';
+ while (num > 0) {
+ for (int i = 0; ; i++) {
+ if (sym_table[i].value < 0) break;
+ if (sym_table[i].value <= num) {
+ num -= sym_table[i].value;
+ r = concat(r, sym_table[i].symbol);
+ break;
+ }
+ }
+ }
+ return r;
+}
+
+int main() {
+ printf("%s\n", intToRoman(1234));
+ return 0;
+} \ No newline at end of file