【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号