AcWing 1568. 中文读数字
原题链接
简单
作者:
eveer
,
2021-08-27 23:07:16
,
所有人可见
,
阅读 322
#include<bits/stdc++.h>
using namespace std;
int main()
{
string digit[10]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
string exp[3]={"Shi","Bai","Qian"};
string num;
cin>>num;
int start=0;//第一个数字所在的位置
if(num[0]=='-')//若符号为负,则首先输出Fu
{
cout<<"Fu"<<' ';
start=0;//由于第一个是符号,所以起始的数字为1
reverse(num.begin(),num.end());
num.pop_back();
reverse(num.begin(),num.end());
}
vector<int>res,wres,qres;//储存数字
for(int i=start;i<num.size();i++)
{
if(i==start&&num.size()==9)//如果所有的数字个数等于9,说明存在亿这个数量单位
cout<<digit[num[i]-'0']<<' '<<"Yi"<<' ';
else
res.push_back(num[i]-'0');
}
reverse(res.begin(),res.end());//将各位移到第0位,便于分割
for(int i=4;i<=7&&i<res.size();i++)
wres.push_back(res[i]);
reverse(wres.begin(),wres.end());
//我们需要知道的是要在中间的某一位数字读出零,那么情况应当是0的右边有一个非零的数字,我们通过循环的方式找到这些0
vector<int>wloc_zero;
int len_wres=wres.size();
for(int i=0;i<=len_wres-2;i++)//遍历每一个数字
{
if(wres[i]==0)//如果这个数字等于0
if(i+1<=len_wres-1)
if(wres[i+1]!=0)//但是下一位不等于0,那么第i位的0就需要读出来
wloc_zero.push_back(i);//记录需要发生的0所在的位置
}
//读出来
for(int i=0;i<len_wres;i++)
{
if(wres[i]==0)
{
for(int k=0;k<wloc_zero.size();k++)
if(i==wloc_zero[k])
cout<<' '<<digit[0];
}
else //如果第i个数非零
{
if(i==0)
{
if(i==len_wres-1)cout<<digit[wres[i]];
else cout<<digit[wres[i]]<<' '<<exp[len_wres-i-2];
}
else
{
if(i!=len_wres-1)cout<<' '<<digit[wres[i]]<<' '<<exp[len_wres-i-2];
else cout<<' '<<digit[wres[i]];
}
}
}
if(len_wres>=1)cout<<' '<<"Wan";
for(int i=0;i<=3&&i<res.size();i++)
qres.push_back(res[i]);
reverse(qres.begin(),qres.end());
//我们需要知道的是要在中间的某一位数字读出零,那么情况应当是0的右边有一个非零的数字,我们通过循环的方式找到这些0
vector<int>qloc_zero;
int len_qres=qres.size();
for(int i=0;i<=len_qres-2;i++)//遍历每一个数字
{
if(qres[i]==0)//如果这个数字等于0
{
if(qres[i+1]!=0)//但是下一位不等于0,那么第i位的0就需要读出来
{
qloc_zero.push_back(i);//记录需要发生的0所在的位置
}
}
}
//读出来
for(int i=0;i<len_qres;i++)
{
if(qres[i]==0)
{
if(len_qres-1==0)//需要特别注意数字0这种情况,要进行特判
{
cout<<digit[0];
break;
}
for(int k=0;k<qloc_zero.size();k++)
{
if(i==qloc_zero[k])
cout<<' '<<digit[0];
}
}
else //如果第i个数非零
{
if(i==0)
{
if(len_wres>=1)cout<<' ';
if(i==len_qres-1)cout<<digit[qres[i]];
else cout<<digit[qres[i]]<<' '<<exp[len_qres-i-2];
}
else
{
if(i!=len_qres-1)cout<<' '<<digit[qres[i]]<<' '<<exp[len_qres-i-2];
else cout<<' '<<digit[qres[i]];
}
}
}
return 0;
}