题目链接
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
.
Input Specification:
Each input file contains one test case, which gives an integer with no more than 9 digits.
Output Specification:
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.
Sample Input 1:
-123456789
Sample Output 1:
Fu yi Yi er Qian san Bai si Shi wu Wan liu Qian qi Bai ba Shi jiu
Sample Input 2:
100800
Sample Output 2:
yi Shi Wan ling ba Bai
思路:注意万位被跳过的情况和0
代码:
#include <bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for(int i=a;i<n;i++)
#define mem(a,n) memset(a,n,sizeof(a))
#define lowbit(i) ((i)&(-i))
typedef long long ll;
typedef unsigned long long ull;
const ll INF=0x3f3f3f3f;
const double eps = 1e-6;
const int N = 1e5+5;
string number[]= {"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"};
string c[]= {"", "Shi", "Bai", "Qian", "Wan", "Shi", "Bai", "Qian", "Yi"};
int main() {
int n,e;
cin>>n;
if(n==0) {
cout<<"ling";
return 0;
} else if(n<0) {
cout<<"Fu ";
n=-n;
}
vector<int>digit;
vector<string>res;
while(n) {
digit.push_back(n%10);
n/=10;
}
for(e=0; e<digit.size(); e++){ ///判断数最后面的连续0
if(digit[e]!=0){
break;
}
}
if(e==8) { ///题目最多为9位数
cout<<number[digit[e]]<<" Yi";
return 0;
}
for(int i=e; i<digit.size(); i++) {
if(i==4 || (i && digit[i])) { ///当前时万位或不是个位且非0
res.push_back(c[i]);
}///跳过了万位亿位
res.push_back(number[digit[i]]);
}
for(int i=res.size()-1; i>=0; i--) {
if(i!=res.size()-1) {
cout<<" ";
}
int cnt=0;
while(i>=0&&res[i]=="ling") {
i--,cnt++;
}
if(cnt!=0 && res[i]!="Wan") { ///当前的res[i]为数字或位数,自己本身(res[i+cnt])是ling
cout<<"ling ";
}
cout<<res[i];
}
return 0;
}