LeetCode-12.整数转化成罗马数字 & LeetCode-13.罗马数字转化成整数
一、整数转化成罗马数字
1. 参考: https://www.jb51.net/article/217252.htm
2. C实现
#include <stdio.h> #include <stdlib.h> #include <ctype.h> #define ARRAY_SIZE(arr) (sizeof(arr)/sizeof(arr[0])) int intToRoman(int num) { int arr[] = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1}; char *str[] = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"}; char rom[256] = {0}; int sz = ARRAY_SIZE(arr); int i, idx=0; for (i = 0; i < sz; i++) { while (num >= arr[i]) { num -= arr[i]; idx += sprintf(rom+idx, "%s", str[i]); //sprintf(char *str, const char *format, ...); } } printf("rom=%s\n", rom); return 0; } int main() { intToRoman(1437); //rom=MCDXXXVII return 0; } //3437==MMMCDXXXVI
二、罗马数字转化成整数
1. 参考: https://www.jb51.net/article/217253.htm
2. 实现
#include <stdio.h> #include <string.h> #define ARRAY_SIZE(arr) (sizeof(arr)/sizeof(arr[0])) int roman_val(char c) { int i, val = 0; int arr[][2] = {{'I', 1}, {'V', 5}, {'X', 10}, {'L', 50}, {'C', 100}, {'D', 500}, {'M', 1000}}; for (i = 0; i < ARRAY_SIZE(arr); i++) { if (c == arr[i][0]) { val = arr[i][1]; } } return val; } int roman_to_int(const char *str) { int i, res = 0; int sz = strlen(str); for (i = 0; i < sz; i++) { if ((i == sz-1) || roman_val(str[i]) >= roman_val(str[i+1])) res += roman_val(str[i]); else res -= roman_val(str[i]); } return res; } //1437==MCDXXXVII int main() { const char *str = "MCDXXXVII"; int val; val = roman_to_int(str); printf("str=%s, val=%d\n", str, val); return 0; }
数字转罗马,可以将其拆开来加减,没有将 CD 强制看成一个整体,要将人类思维向计算机思维抽象。
posted on 2025-02-14 14:59 Hello-World3 阅读(9) 评论(0) 收藏 举报