1082 Read Number in Chinese
题意描述
给一个不超过9位的数 要求输出 数在传统中文的读法
输入输出格式
输入即为一个不超过9位的十进制整数 可正可负 输出它的中文读法 两个单词之间用空格隔开
数据规模
数最多有9位
算法设计
首先 确定一个方向 我们要处理 ling
的添加 数字和中文的对应 以及数字对应的权重的中文
- 我们可以先将数字逆序 从个位开始枚举 ,若这位数字不为0,我们将其对应的中文添加至结果向量
res
中 - 我们设立两个表 第一个表是数字中文进行转换 ,第二个表是数字的进制单位转换 比如 当枚举到
500
的5
时 我们应当添加wu bai
至结果向量中 -
ling
的处理。 添加ling
的原因是 数字在某一位上的取值为 0 比如 千位 百位 比如 1050 读作 yi Qian ling wu Shi 就是因为在百位上 1050 的值为0 - 但这里要注意 两个
ling
不能重叠 即 这个数可能千位为0,百位也为0,显然只要加一个ling
即可。 - 这个数 可能万位为0,比如500000 但是 它读作五十万 它有
万
这个单位的,所以我们可以单独拿出来判断一下,即 如果这个数万位为0,但只要十万位,百万位,千万位 有一个不为0 我们就应该在枚举到这位时添加一个wan
- 同时 为了避免出现
ling wan
我们也需要判定wan
的前面没有ling
- 最后 注意边界 即数字为0 输出就是
ling
- 将
res
逆序 控制格式输出即可
c++代码
#include <bits/stdc++.h>
using namespace std;
using gg = long long;
string biao1[]{"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
string biao2[]{"Ge","Shi","Bai","Qian","Wan","Shi","Bai","Qian","Yi"};
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
string stri;
cin>>stri;
if(stri[0] == '-') {
cout<<"Fu ";
stri = stri.substr(1);
}
vector<string>res;
reverse(stri.begin(),stri.end());
gg len = stri.size();
bool flag = false;
for(gg i=0;i<len;i++){
if((i == 5 or i==6 or i== 7) and stri[i] !='0') {
flag = true;
break;
}
}
for(gg i=0;i<len;i++){
if(i == 4 and (stri[i] == '0') and flag) res.push_back("Wan");
if(i ==0 and (stri[i] != '0')) res.push_back(biao1[stri[i]-'0']);
else if(i>0 and (stri[i] =='0') and res.size() and (res.back() != "ling") and (res.back() != "Wan")) res.push_back("ling");
else if(i>0 and (stri[i] != '0')) res.push_back(biao1[stri[i]-'0']+" "+biao2[i]);
}
reverse(res.begin(),res.end());
len = res.size();
for(gg i=0;i<len;i++){
if(i) cout<<" ";
cout<<res[i];
}
if(stri == "0") cout<<"ling"; // '真'数据边界...
return 0;
}