这道题目一度给我留下阴影,各种判断实在繁琐。今天突然明白过来了,这是最适合“打表”的一道题。
输入:一个十进制数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];
}
}