题目描述
Given an integer with no more than 9 digits, you are supposed to read it in the traditional Chinese way. Output "Fu" first if it is negative. For example, -123456789 is read as "Fu yi Yi er Qian san Bai si Shi wu Wan liu Qian qi Bai ba Shi jiu". Note: zero ("ling") must be handled correctly according to the Chinese tradition. For example, 100800 is "yi Shi Wan ling ba Bai".
输入描述:
Each input file contains one test case, which gives an integer with no more than 9 digits.
输出描述:
For each test case, print in a line the Chinese way of reading the number. The characters are separated by a space and there must be no extra space at the end of the line.
输入例子:
-123456789
输出例子:
Fu yi Yi er Qian san Bai si Shi wu Wan liu Qian qi Bai ba Shi jiu
这道题看似简单,实则非常困难,需要填的坑特别多。
我的代码:
(注:在牛客网上十九个测试点都通过了。但是在PAT甲级真题网上还有一个测试点尚未通过)
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
vector<char>v;
vector<char>::iterator it,ot;
char a[20];
int i,j=0,k=0,flag=0,n;
string b[20],c[9]={"yi","er","san","si","wu","liu","qi","ba","jiu"};
int main()
{
gets(a);
n=atoi(a);
for(i=0;a[i];i++) v.push_back(a[i]);
reverse(v.begin(),v.end());
for(it=v.begin();it!=v.end();it++)
{
j++;
if(*it=='0')
{
if(n==0) b[k++]="ling";
else if(flag==0) continue;
else if(j==5)
{
for(ot=it;ot!=v.end();ot++)
{
j++;
if(*ot!='0') break;
}
if(j<=9)
{
flag=0;
b[k++]="Wan";
}
j=5;
}
else
{
flag=0;
b[k++]="ling";
}
}
else if(*it=='-') b[k++]="Fu";
else
{
flag=1;
if(j==2 || j==6) b[k++]="Shi";
else if(j==3 || j==7) b[k++]="Bai";
else if(j==4 || j==8) b[k++]="Qian";
else if(j==5) b[k++]="Wan";
else if(j==9) b[k++]="Yi";
b[k++]=c[*it-'0'-1];
}
}
while(k-- && k>=1) cout<<b[k]<<" ";
cout<<b[0]<<endl;
return 0;
}