PAT 1082

题目 : Read Number in Chinese

分值 : 25
难度 : 中等题
思路 : 有点恶心的题目
知识 : 你要考虑很多,比如100800 就是十万零八百

具体代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
#include <cstring>
using namespace std;
int main(){
int len,k=0,num=0;
char a[15],s[30][5],c[10][5]={"Shi","Bai","Qian","Wan","Yi"};
char b[15][5]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
cin>>a;len=strlen(a);
if(a[0]=='-'){ //先输出负数符号
cout<<"Fu ";
k++;
}
if(len==1&&a[0]=='0') cout<<b[0]; //特例,只有一位数且为0时,直接输出"ling"
bool flag=false;
for(int i=k;i<len;i++){
if(a[i]=='0'&&len-i-1!=4) flag=true; //当前位为0且不是个位,低一位不为0且不为千位(千位的高一位为0时不用读零,如808000),输出“ling”
if(a[i]!='0'){
if(flag==true){ //没有i+1<len 这个条件的话输入10会输出"yi Shi ling"
strcpy(s[num++],b[0]);
flag=false;
}
strcpy(s[num++],b[a[i]-'0']); //当前位不为0时
if((len-i)%4==2) strcpy(s[num++],c[0]); //十,输出"Shi"
if((len-i)%4==3) strcpy(s[num++],c[1]); //百,输出"Bai"
if((len-i)%4==0) strcpy(s[num++],c[2]); //千,输出"Qian"
}
if(len-i==5){
if(a[i]=='0'&&a[i-1]=='0'&&a[i-2]=='0'&&a[i-3]=='0'); //万,输出"Wan"(没有出现万这个小节位数全为0时,如800000008)
else strcpy(s[num++],c[3]);
}
if(len-i==9) strcpy(s[num++],c[4]); //亿,输出"Yi"
}
for(int i=0;i<num;i++){
cout<<s[i];
if(i!=num-1)
cout<<" ";
}
return 0;
}