这个题的难点在于对前导零的处理,具体的处理思路如下:
如果有前导0就要考虑前面有没有数,如果有数
就要读,如果没数不读前导零且当前读的数字是第一
个。若没有前导零,考虑前面有无数,有数的话输出空格
没数的话不输出空格 。其中有无数用flag标识,flag==1为有数。
#include<cstdio>
char pinyin[10][5]={"ling","yi","er","san","si",
"wu","liu","qi","ba","jiu"};
void printDanwei(int i)
{
if(i==0) printf(" Qian");
if(i==1) printf(" Bai");
if(i==2) printf(" Shi");
}
/*如果有前导0就要考虑前面有没有数,如果有数
就要读,如果没数不读前导零且当前读的数字是第一
个。若没有前导零,考虑前面有无数,有数的话空格
没数的话没用空格
*/
int main()
{
int a;
int fu=0;
scanf("%d",&a);
if(a<0){
printf("Fu");
fu=1;
a = -a;
}
int Yi=0;
int Wan[4]={0};
int Ge[4]={0};
for(int i=3; i>=0; i--){
Ge[i] = a%10;
a/=10;
}
for(int i=3; i>=0; i--){
Wan[i] = a%10;
a/=10;
}
Yi = a;
int flag = 0;//说明此时前面没数字
int pre0 = 0;//说明此时无前导零
if(Yi!=0){
flag=1;
if(fu==1) printf(" ");
printf("%s Yi",pinyin[Yi]);
}
for(int i=0; i<4; i++){
if(Wan[i]==0) pre0=1;
else{
if(pre0==1){
if(flag==1){
printf(" ling");
printf(" %s",pinyin[Wan[i]]);
printDanwei(i);
}
else{
if(fu==1) printf(" ");
printf("%s",pinyin[Wan[i]]);
printDanwei(i);
flag=1;
}
}
else{
if(flag==1){
printf(" %s",pinyin[Wan[i]]);
printDanwei(i);
}
else{
if(fu==1) printf(" ");
printf("%s",pinyin[Wan[i]]);
printDanwei(i);
flag=1;
}
}
pre0 = 0;//前导零没了
}
}
for(int i=0; i<4; i++){
if(Wan[i]!=0){
printf(" Wan");
break;
}
}
pre0 = 0;
for(int i=0; i<4; i++){
if(Ge[i]==0) pre0=1;
else{
if(pre0==1){
if(flag==1){
printf(" ling");
printf(" %s",pinyin[Ge[i]]);
printDanwei(i);
}
else{
if(fu==1) printf(" ");
printf("%s",pinyin[Ge[i]]);
printDanwei(i);
flag=1;
}
}
else{
if(flag==1){
printf(" %s",pinyin[Ge[i]]);
printDanwei(i);
}
else{
if(fu==1) printf(" ");
printf("%s",pinyin[Ge[i]]);
printDanwei(i);
flag=1;
}
}
pre0 = 0;//前导零没了
}
}
if(flag==0) printf("ling");
}