PAT-Advanced 1082 Read Number in Chinese

这道题目一度给我留下阴影,各种判断实在繁琐。今天突然明白过来了,这是最适合“打表”的一道题。

输入:一个十进制数N,可正可负可零,不超过十进制9位

输出:这个数的汉语拼音(包括其中“负” “亿” “万” “零” “千” “百” “十” 的拼音)

思路:

① 把N分成 亿,万,个 三部分,根据每个部分为0或不为0有8种情况(实际7种,全0很好办),判断各个部分之间是否要输出“亿” “万” 和各部分之间的 “零”。

② 每个部分都是0000~9999,再分成 千,百,十,一 四位,一共16种情况(实际15种),判断每种情况输出的各位汉字,以及是否要输出 “千” “百” “十” 和中间的  “零”

例:10 0802 十万 零 八百 零 二 ,这里的两个“零”是不同的 

代码如下

#include <iostream>
#include <cstring>
#include <vector>
#include <string>
using namespace std;

string numbers[10] = {"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
int yi, wan, ge;

vector<string> result;

void Output(int i)//输出1-9999,不考虑各个部分之间的“零”
{
    int qian = i / 1000, bai = i % 1000 / 100, shi = i % 100 / 10, ge = i % 10;
    int flag = 0;
    if (qian > 0)flag += 8; if (bai > 0)flag += 4; if (shi > 0)flag += 2; if (ge > 0)flag += 1;
    switch (flag)
    {
    case 1://3
        result.push_back(numbers[ge]);
        break;
    case 2://30
        result.push_back(numbers[shi]);
        result.push_back("Shi");
        break;
    case 3://33
        result.push_back(numbers[shi]);
        result.push_back("Shi");
        result.push_back(numbers[ge]);
        break;
    case 4://300
        result.push_back(numbers[bai]);
        result.push_back("Bai");
        break;
    case 5://303
        result.push_back(numbers[bai]);
        result.push_back("Bai");
        result.push_back("ling");
        result.push_back(numbers[ge]);
        break;
    case 6://330
        result.push_back(numbers[bai]);
        result.push_back("Bai");
        result.push_back(numbers[shi]);
        result.push_back("Shi");
        break;
    case 7://333
        result.push_back(numbers[bai]);
        result.push_back("Bai");
        result.push_back(numbers[shi]);
        result.push_back("Shi");
        result.push_back(numbers[ge]);
        break;
    case 8://3000
        result.push_back(numbers[qian]);
        result.push_back("Qian");
        break;
    case 9://3003
        result.push_back(numbers[qian]);
        result.push_back("Qian");
        result.push_back("ling");
        result.push_back(numbers[ge]);
        break;
    case 10://3030
        result.push_back(numbers[qian]);
        result.push_back("Qian");
        result.push_back("ling");
        result.push_back(numbers[shi]);
        result.push_back("Shi");
        break;
    case 11://3033
        result.push_back(numbers[qian]);
        result.push_back("Qian");
        result.push_back("ling");
        result.push_back(numbers[shi]);
        result.push_back("Shi");
        result.push_back(numbers[ge]);
        break;
    case 12://3300
        result.push_back(numbers[qian]);
        result.push_back("Qian");
        result.push_back(numbers[bai]);
        result.push_back("Bai");
        break;
    case 13://3303
        result.push_back(numbers[qian]);
        result.push_back("Qian");
        result.push_back(numbers[bai]);
        result.push_back("Bai");
        result.push_back("ling");
        result.push_back(numbers[ge]);
        break;
    case 14://3330
        result.push_back(numbers[qian]);
        result.push_back("Qian");
        result.push_back(numbers[bai]);
        result.push_back("Bai");
        result.push_back(numbers[shi]);
        result.push_back("Shi");
        break;
    case 15://3333
        result.push_back(numbers[qian]);
        result.push_back("Qian");
        result.push_back(numbers[bai]);
        result.push_back("Bai");
        result.push_back(numbers[shi]);
        result.push_back("Shi");
        result.push_back(numbers[ge]);
        break;
    }
}


int main()
{
    int n;
    cin >> n;
    if (n < 0) { result.push_back("Fu"); n = -n; }
    if (n == 0) { cout << "ling"; return 0; }
    yi = n / 100000000;
    wan = n % 100000000 / 10000;
    ge = n % 10000;

    int flag = 0;
    if (yi > 0)flag += 4; if (wan > 0)flag += 2; if (ge > 0)flag += 1;

    switch (flag)
    {
    case 1://0000 0000 0110
        Output(ge);
        break;
    case 2://0000 0110 0000
        Output(wan);
        result.push_back("Wan");
        break;
    case 3://0000 0110 0110
        Output(wan);
        result.push_back("Wan");
        //是否有零
        if (ge < 1000) { result.push_back("ling"); }
        Output(ge);
        break;
    case 4://0110 0000 0000
        Output(yi);
        result.push_back("Yi");
        break;
    case 5://0110 0000 0110 
        Output(yi);
        result.push_back("Yi");
        //是否有零
        if (ge < 1000) { result.push_back("ling"); }
        Output(ge);
        break;
    case 6://0110 0110 0000
        Output(yi);
        result.push_back("Yi");
        //是否有零
        if (wan < 1000) { result.push_back("ling"); }
        Output(wan);
        result.push_back("Wan");
        break;
    case 7://0110 0110 0110
        Output(yi);
        result.push_back("Yi");
        //是否有零
        if (wan < 1000) { result.push_back("ling"); }
        Output(wan);
        result.push_back("Wan");
        //是否有零
        if (ge < 1000) { result.push_back("ling"); }
        Output(ge);
        break;
    }

    for (int i = 0; i < result.size(); i++)
    {
        if (i != 0)cout << " ";
        cout << result[i];
    }
}
 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值