前言
正文
参考题解
#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;
}