#include <iostream>
#include <string>
#include <sstream>
#include <cctype>
using namespace std;
// 函数用于将罗马数字转换为整数
int romanToInt(string roman) {
int result = 0;
int num[256];
num['I'] = 1;
num['V'] = 5;
num['X'] = 10;
num['L'] = 50;
num['C'] = 100;
num['D'] = 500;
num['M'] = 1000;
for (size_t i = 0; i < roman.size(); ++i) {
if (i + 1 < roman.size() && num[roman[i]] < num[roman[i + 1]]) {
result -= num[roman[i]];
} else {
result += num[roman[i]];
}
}
return result;
}
// 函数用于将整数转换为罗马数字(简单实现,仅处理题目范围内的情况)
string intToRoman(int num) {
string romanSymbols[] = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
int values[] = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
string result;
for (size_t i = 0; i < 13; ++i) {
while (num >= values[i]) {
result += romanSymbols[i];
num -= values[i];
}
}
return result;
}
// 函数用于将英文单词表示的数字转换为整数(简单实现,仅处理题目范围内的情况)
int wordToInt(string word) {
if (word == "ZERO") return 0;
if (word == "ONE") return 1;
if (word == "TWO") return 2;
if (word == "THREE") return 3;
if (word == "FOUR") return 4;
if (word == "FIVE") return 5;
if (word == "SIX") return 6;
if (word == "SEVEN") return 7;
if (word == "EIGHT") return 8;
if (word == "NINE") return 9;
if (word == "TEN") return 10;
return -1; // 如果输入的单词不在处理范围内,返回 -1表示错误
}
// 函数用于将整数转换为英文单词表示(简单实现,仅处理题目范围内的情况)
string intToWord(int num) {
string words[] = {"ZERO", "ONE", "TWO", "THREE", "FOUR", "FIVE", "SIX", "SEVEN", "EIGHT", "NINE", "TEN"};
if (num >= 0 && num <= 10) {
return words[num];
}
return ""; // 如果输入的数字不在处理范围内,返回空字符串表示错误
}
// 函数用于将汉字表示的数字转换为整数(简单实现,仅处理题目范围内的情况)
int chineseToInt(string chinese) {
if (chinese == "零") return 0;
if (chinese == "一") return 1;
if (chinese == "二") return 2;
if (chinese == "三") return 3;
if (chinese == "四") return 4;
if (chinese == "五") return 5;
if (chinese == "六") return 6;
if (chinese == "七") return 7;
if (chinese == "八") return 8;
if (chinese == "九") return 9;
if (chinese == "十") return 10;
return -1; // 如果输入的汉字不在处理范围内,返回 -1表示错误
}
// 函数用于将整数转换为汉字表示(简单实现,仅处理题目范围内的情况)
string intToChinese(int num) {
string chineseNums[] = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十"};
if (num >= 0 && num <= 10) {
return chineseNums[num];
}
return ""; // 如果输入的数字不在处理范围内,返回空字符串表示错误
}
// 函数用于处理分数的加法运算
string fractionAddition(string fraction1, string fraction2) {
int num1, den1, num2, den2;
sscanf(fraction1.c_str(), "%d/%d", &num1, &den1);
sscanf(fraction2.c_str(), "%d/%d", &num2, &den2);
int newNum = num1 * den2 + num2 * den1;
int newDen = den1 * den2;
// 约分(简单实现,仅处理本题目简单情况)
for (int i = newDen; i > 1; --i) {
if (newNum % i == 0 && newDen % i == 0) {
newNum /= i;
newDen /= i;
}
}
ostringstream oss;
oss << newNum << "/" << newDen;
return oss.str();
}
// 函数用于处理百分数的加法运算
string percentageAddition(string percentage1, string percentage2) {
int num1 = stoi(percentage1.substr(0, percentage1.size() - 1));
int num2 = stoi(percentage2.substr(0, percentage2.size() - 1));
int sum = num1 + num2;
ostringstream oss;
oss << sum << "%";
return oss.str();
}
int main() {
string input1, input2;
cin >> input1 >> input2;
bool isRoman1 = true, isRoman2 = true;
bool isWord1 = true, isWord2 = true;
bool isChinese1 = true, isChinese2 = true;
bool isFraction1 = false, isFraction2 = false;
bool isPercentage1 = false, isPercentage2 = false;
bool isNegative1 = false, isNegative2 = false;
// 判断是否为罗马数字
for (char c : input1) {
if (!isupper(c)) {
isRoman1 = false;
break;
}
}
for (char c : input2) {
if (!isupper(c)) {
isRoman2 = false;
break;
}
}
// 判断是否为英文单词表示的数字
stringstream ss1(input1), ss2(input2);
string word1, word2;
ss1 >> word1;
ss2 >> word2;
if (wordToInt(word1) == -1) isWord1 = false;
if (wordToInt(word2) == -1) isWord2 = false;
// 判断是否为汉字表示的数字
if (chineseToInt(input1) == -1) isChinese1 = false;
if (chineseToInt(input2) == -1) isChinese2 = false;
// 判断是否为分数
if (input1.find('/')!= string::npos) isFraction1 = true;
if (input2.find('/')!= string::npos) isFraction2 = true;
// 判断是否为百分数
if (input1.back() == '%') isPercentage1 = true;
if (input2.back() == '%') isPercentage2 = true;
// 判断是否为负数(仅针对数字和汉字)
if (input1[0] == '-' && (isdigit(input1[1]) || chineseToInt(input1.substr(1))!= -1)) isNegative1 = true;
if (input2[0] == '-' && (isdigit(input2[1]) || chineseToInt(input2.substr(1))!= -1)) isNegative2 = true;
int num1 = 0, num2 = 0;
if (isRoman1) num1 = romanToInt(input1);
else if (isWord1) num1 = wordToInt(word1);
else if (isChinese1) num1 = chineseToInt(input1);
else if (isFraction1) {
num1 = 0; // 分数暂不转换为整数,后续直接处理分数运算
} else if (isPercentage1) {
num1 = stoi(input1.substr(0, input1.size() - 1));
} else if (isdigit(input1[0]) || (isNegative1 && isdigit(input1[1]))) {
stringstream ss(input1);
ss >> num1;
}
if (isRoman2) num2 = romanToInt(input2);
else if (isWord2) num2 = wordToInt(word2);
else if (isChinese2) num2 = chineseToInt(input2);
else if (isFraction2) {
num2 = 0; // 分数暂不转换为整数,后续直接处理分数运算
} else if (isPercentage2) {
num2 = stoi(input2.substr(0, input2.size() - 1));
} else if (isdigit(input2[0]) || (isNegative2 && isdigit(input2[1]))) {
stringstream ss(input2);
ss >> num2;
}
string result;
if (isFraction1 && isFraction2) {
result = fractionAddition(input1, input2);
} else if (isPercentage1 && isPercentage2) {
result = percentageAddition(input1, input2);
} else {
int sum = num1 + num2;
if (isRoman1 || isRoman2) {
result = intToRoman(sum);
} else if (isWord1 || isWord2) {
result = intToWord(sum);
} else if (isChinese1 || isChinese2) {
result = intToChinese(sum);
} else {
ostringstream oss;
oss << sum;
result = oss.str();
}
}
cout << result << endl;
return 0;
}
同学的,49pts