bdjw,求助U487951
  • 板块灌水区
  • 楼主mixue_bc
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/12/7 18:18
  • 上次更新2024/12/7 21:30:10
查看原帖
bdjw,求助U487951
1260767
mixue_bc楼主2024/12/7 18:18
#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

2024/12/7 18:18
加载中...