1 条题解
-
0
题目分析
本题要求实现一个MCXI数字系统与整数的相互转换工具。MCXI系统使用四个字母(m、c、x、i)表示千位、百位、十位和个位,并可使用前缀数字(2-9)表示倍数。需要实现的功能:
- 将MCXI字符串转换为对应整数值
- 将两个MCXI字符串的整数值相加
- 将和转换为MCXI字符串
解决思路
-
MCXI转整数:
- 遍历字符串,如果当前字符是数字(2-9),则与下一个字母组合计算值(数字 * 字母的基值)
- 如果当前字符是字母,直接加上对应基值
- 注意字母顺序必须为m、c、x、i,且每个字母最多出现一次
-
整数转MCXI:
- 按千位、百位、十位、个位依次处理
- 对于每位数字:
- 0:跳过不输出
- 1:只输出对应字母
- 2-9:先输出数字再输出字母
完整代码
#include <iostream> #include <cstring> #include <string> using namespace std; int convert_mcxi_to_int(const char* str) { int sum = 0; for (int i = 0; i < strlen(str); ) { if (str[i] >= '2' && str[i] <= '9') { int multiplier = str[i] - '0'; i++; switch (str[i]) { case 'm': sum += multiplier * 1000; break; case 'c': sum += multiplier * 100; break; case 'x': sum += multiplier * 10; break; case 'i': sum += multiplier; break; } i++; } else { switch (str[i]) { case 'm': sum += 1000; break; case 'c': sum += 100; break; case 'x': sum += 10; break; case 'i': sum += 1; break; } i++; } } return sum; } string int_to_mcxi(int num) { const int units[] = {1000, 100, 10, 1}; const char letters[] = {'m', 'c', 'x', 'i'}; string result; for (int i = 0; i < 4; i++) { int digit = num / units[i]; num %= units[i]; if (digit == 0) continue; if (digit != 1) { result += '0' + digit; } result += letters[i]; } return result; } int main() { int n; cin >> n; while (n--) { string a, b; cin >> a >> b; int num_a = convert_mcxi_to_int(a.c_str()); int num_b = convert_mcxi_to_int(b.c_str()); int sum = num_a + num_b; cout << int_to_mcxi(sum) << endl; } return 0; }
代码说明
-
convert_mcxi_to_int函数:
- 使用指针遍历字符串,通过识别数字和字母分别处理
- 计算字母对应基值后累加到总和
-
int_to_mcxi函数:
- 使用数组保存单位与字母的对应关系
- 按从高到低的顺序处理每位数字,根据数值情况选择输出格式
- 使用字符串拼接生成结果
-
主函数:
- 读入多组测试数据
- 转换、相加、再转换后输出结果
- 使用string简化输入处理
- 1
信息
- ID
- 1685
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者