PAT - A1078

1082 Read Number in Chinese (25point(s))

  • 边界条件复杂,代码dirty

    • Number == 0时,发零音
    • Number 万~千万位 == 0 时,Wan不发音
  • 源码

#include<bits/stdc++.h>

/*
ID   : A1082
TYPE : String
TIME : 2020.3.2
DURANCE :
NOTICE :
    边界条件要考虑挺多,代码较为dirty
    Number == 0时,发零音
    Number 万~千万位 == 0 时,"Wan"不发音
*/

using namespace std;

string Number;
string digit[10] = {"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"};
string degree[6] = {"_", "Shi", "Bai", "Qian", "Wan", "Yi"};

int main(void) {
    vector<string> Result;
    cin >> Number;
    reverse(Number.begin(), Number.end());
    bool flag = false; // 控制位,如果出现了非零数那本四位下个零发音,否则不发音
    for (int i = 0; i < Number.size(); ++i) {
        if (Number[i] == '-') {
            Result.push_back("Fu");
        }
        else if (i < 4) {
            if (Number[i] != '0') {
                flag = true; // 本四位下个零发音
                if (i > 0) Result.push_back(degree[i]);
                Result.push_back(digit[Number[i] - '0']);
            }
            if (flag && Number[i] == '0') {
                Result.push_back(digit[0]);
                flag = false; // 本四位下个零又不发音
            }
        } else if (i == 4){
            flag = false; // 下四位
            Result.push_back(degree[4]);
            if (Number[i] != '0') {
                flag = true; // 下个零发音
                Result.push_back(digit[Number[i] - '0']);
            }
        }
        else if (i > 4 && i < 8){
            if (Number[i] != '0') {
                flag = true; // 下个零发音
                Result.push_back(degree[i-4]);
                Result.push_back(digit[Number[i] - '0']);
            }
            if (flag && Number[i] == '0') {
                Result.push_back(digit[0]);
                flag = false; // 本四位下个零不发音
            }
        } else if (i == 8) {
            if (Number[7] == '0' &&Number[6] == '0' &&Number[5] == '0' &&Number[4] == '0')
                Result.pop_back(); // 连续四个0则将“Wan"删除
            Result.push_back(degree[5]);
            if (Number[i] != '0') Result.push_back(digit[Number[i] - '0']);
        }
    }
    if (Number.size() == 1 && Number[0] == '0') Result.push_back(digit[0]);
    for (int i = Result.size()-1; i >= 0 ; --i) cout << Result[i] << ((i==0)?"\n":" ");

    return 0;
}

posted @ 2020-03-02 02:36  XiuyuanLee  阅读(133)  评论(0)    收藏  举报