【1082 25 字符串】 Read Number in Chinese
传送门
题意
给定一个数字,输出他的中文读法
数据范围
\(digit\leq 9\)
题解
- 连续零的处理,以及后面全为\(0\)的处理
- 进位表示的处理
Code
#include<bits/stdc++.h>
using namespace std;
string c[4]={"","Shi","Bai","Qian"};
string exc[3]={"","Wan","Yi"};
string digit[10]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
bool ling; // 未输出的0
bool output(const string&s,int left,int right,bool space){
bool out=0;
for(int i=left;i<right;++i) //遍历字符串s的[left,right)区间
if(s[i]=='0') ling=true;
else { //当前字符不为'0'
if(ling) cout<<" ling "<<digit[s[i]-'0'],ling=0;
else if(!out) printf("%s%s",space?" ":"",digit[s[i]-'0'].c_str());
else cout<<" "<<digit[s[i]-'0'];
if(i < right-1) cout<<" "<<c[4-(i-left+1)];
out=1;
}
if(out) ling=0;
return out;
}
int main(){
string s; cin>>s;
if(s[0]=='-') {s.erase(0,1);cout<<"Fu ";}
if(s=="0") cout<<"ling";
int group = s.size()%4==0?s.size()/4-1:s.size()/4;
int extra = s.size()%4==0?4:s.size()%4;
for(int i=0;i<s.size();){//遍历字符串s
bool out = i==0?output(s,0,extra,0):output(s,i,i+4,1);
i+=(i==0)?extra:4;
if(group!=0&&out) cout<<" "<<exc[group]; //输出万、亿位级
--group;
}
return 0;
}

浙公网安备 33010602011771号