PAT-A1082.Read Number in Chinese 【字符串处理】

思路:

# 分 亿位、中间4位、低4位 这三块来分别讨论

# 需要很细心地考虑到很多种情况,//输出过程中很容易多输出空格,但不易察觉,可以先用 * 代替空格输出,可以很快发现错误,待程序正确后再改回来

# 程序结尾 附有 供测试的数据

/***************************************
//@Author: 3stone
//@ACM: PAT-A1082.Read Number in Chinese
//@Time: 18/1/26
//@IDE: VS2017
****************************************/
#include<cstdio>
#include<iostream>
#include<string>
using namespace std;

int main() {
    string num[10] = { "ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu" };
    string radix[6] = { "", "Shi", "Bai", "Qian", "Wan", "Yi" };
    string str;
    int flag_start = true; //记录是否为第一个要输出的字符
    cin >> str;
    if (str == "0") { cout << "ling" << endl; return 0; } //单独处理0
    //若为负数,先输出负号,转为正数
    if (str[0] == '-') {
        cout << "Fu";
        flag_start = false;
        str = str.erase(0, 1);
    }
    int len = str.size(), flag_0 = true; //记录是否出现0

    for (int i = 0; i < len - 1; i++) {
        int tempNum = str[i] - '0';
        int rest = len - i - 1;
        // 单独处理0
        if (tempNum == 0) {
            if (!flag_0) continue; //之前位也是0,不处理,扫描下一位
            flag_0 = false; //若是第一次出现0,做记录
        }
        else if (rest == 8) { //亿位
            if (!flag_start) cout << " ";//判断是否为第一个要输出的字符
            else flag_start = false;
            cout << num[tempNum] << " Yi";
        }
        else if (rest >= 4 && rest <= 7) { // 中间四位(万,十万,百万,千万)
            while (rest > 3) { //一次性处理完中间四位
                if (str[i] - '0' != 0) {
                    if (!flag_0 && rest != 7)//如果前面有0 且 不是千万位
                        cout << " ling";
                    flag_0 = true; //记录不是0
                    if (!flag_start) cout << " ";//判断是否为第一个字符
                    else flag_start = false;
                    if (rest == 4)
                        cout << num[str[i] - '0'];
                    else
                        cout << num[str[i] - '0'] << " " << radix[rest - 4];
                }
                else {
                    if (flag_0)
                        flag_0 = false; //若是第一次出现0,记录,否则扫描下一位
                }
                i++;
                rest--;
            }
            i--; rest++;
            cout << " Wan";
        }
        else { //低四位
            if (!flag_0 && rest != 3) //如果前面有0 且不是千位
                cout << " ling";
            flag_0 = true; //记录不是0
            if (!flag_start) cout << " ";//判断是否为第一个字符
            else flag_start = false;
            cout << num[tempNum] << " " << radix[rest];
        }
    }
    //单独处理最后一位
    if (str[len - 1] - '0' != 0) { 
        if (!flag_start) cout << " ";//判断是否为第一个字符
        else flag_start = false;
        if (flag_0)
            cout << num[str[len - 1] - '0'] << endl;
        else
            cout << "ling " << num[str[len - 1] - '0'] << endl;
    }

    system("pause");
    return 0;
}

/*
测试样例
0   ling
8   ba
808080808   ba Yi ling ba Bai ling ba Wan ling ba Bai ling ba
-880808080  Fu ba Yi ba Qian ling ba Shi Wan ba Qian ling ba Shi
800000008   ba Yi ling ba
800000000   ba Yi
80000008    ba Qian Wan ling ba
80008000    ba Qian Wan ba Qian
80000000    ba Qian Wan
*/

猜你喜欢

转载自blog.csdn.net/qq_26398495/article/details/79172622