题目:click me~
题意:输入一个数字,要求输出中文读数字的拼音。
解题思路:
1.分成3节(亿节,万节,个节)每节的读音相同:x千xx十x,每输出一节后加上亿/万(个节省略)。
2.零的输出:在数字的某节中,某个非零位(该节千位除外)的高位为零,那么需要在该非零位前额外发音一个零。例如:
3030三千零三十;10003一万零三;30003000三千万三千(没有额外的零)。
可以用一个flag来判断是否存在累积的零。
code:
#include<iostream>
#include<string>
using namespace std;
int main(){
string num[12]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
string c[6]={"Ge","Shi","Bai","Qian","Yi","Wan"};
int J[]={1,10,100,1000,10000,100000,1000000,10000000,100000000};
int n;
cin>>n;
int part[3];
if(n==0){
cout<<"ling";
return 0;
}
if(n<0){
cout<<"Fu ";
n=-n;
}
part[0]=n/100000000;
part[1]=(n%100000000)/10000;
part[2]=n%10000;
bool zero=false;//是否在非零数前输出合适的ling
int p=0;//用于维护单词前没有空格,之后输入的单词都在前面加一个空格。
for(int i=0;i<3;i++){
int temp=part[i];//三个部分,每部分命名规则一样,都是x千x百x十x。
for(int j=3;j>=0;j--){
int curpos=8-i*4+j;//当前数字的位置
if(curpos>=9)continue;//最多九位数
int cur=(temp/J[j])%10;//取出当前数字
if(cur!=0){
if(zero){
p++==0?cout<<"ling":cout<<" ling";
zero=false;
}
if(j==0){
p++==0?cout<<num[cur]:cout<<" "<<num[cur];
}else{
p++==0?cout<<num[cur]<<" "<<c[j]:cout<<" "<<num[cur]<<" "<<c[j];
}
}else if(!zero&&j!=0&&n/J[curpos]>=10)zero=true;
}
if(i!=2&&part[i]>0)cout<<" "<<c[i+4];//处理完每部分后,最后输出单位,Yi/Wan
}
return 0;
}