前言

传送门

正文

参考题解

#include<iostream>
#include<string> 
#include<algorithm>
using namespace std;
/* 题意:将一个整数按照中文读法,输出其拼音 如: 输入 -123456789 输出 Fu yi Yi er Qian san Bai si Shi wu Wan liu Qian qi Bai ba Shi jiu 刚开始看是真的没思路,不晓得咋么去模拟,后面看算法笔记才晓得每个整数可以 从低位开始每四个一组(每组称为节,即个节,万节,亿节),大单位分别是"个(实际不说出来)"、 “万”、“亿”,每组内的数字又有小单位“千”、“百”、“十”、“个(实际不说出来)”。 明确了输出的规则如下: 1、如果数字的某节(例如个节,万节,亿节) 中,某个非零位(千位除外)的高位是零,那么在 需要在该非零位的发音前额外输出一个零。例如8080(ba qian ling ba shi)、8008(ba qian ling ba) 、10808(yi wan ling ba bai ling ba) 2、每节的末尾需要输出万或者亿(个节除外) 注意: 需要注意特判输入是0的时候直接输出ling */
string num[10]={"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"};
string wei[3]={"Shi","Bai","Qian"};
string jie[2]={"Wan","Yi"}; 
int main(){
	string str;
	cin>>str;
	int len=str.size();
	int left=0,right=len-1;
	if(str[left]=='-'){
		printf("Fu");
		left++;	
	}
	//前导零 
	while(str[left]=='0'&&left<len){
		left++;
	} 
	//特判输入是0的情况 
	if(left==len){
		cout<<"ling"<<endl;
		return 0;	
	}
	while(left+4<=right){//将left和right分别指向第一节的最高位和最低位 
		right-=4;
	}
	
	while(left<len){//依次判断每一节中(四位或者小于四位)
		bool isZero=false,isPrint=false;//isZero==false表示没有零 ,isPrint表示该节没有输出过其他的位(则相应不需要输出Wan或者Yi) 
		while(left<=right){//遍历每一节中的每一位 
			if(str[left]=='0') isZero=true;
			else{//当前位不为0 
				if(isZero){//高位存在0 
				cout<<" ling";
				isZero=false;
			} 
			if(left>0)cout<<" ";//只要不是首位,后面每一位输出之前都要输出空格
			cout<<num[str[left]-'0'];//输出当前位的数字
			isPrint=true;//说明本节至少输出过一位 
			if(left!=right){
				//除本节的个位以外,都需要输出十百千 
				cout<<" "<<wei[right-left-1]; 
			}	 
			}
			left++;
		}
		if(isPrint&&right!=len-1){//只要不是个节,则相应输出Wan或者Yi 
			cout<<" "<<jie[(len-1-right)/4-1]; 
		} 
		right+=4;//输出下一节 
	} 

	return 0;
}