题目
给定一个不超过 9 位的整数,你应该用传统的中文方式阅读它.
如果是负数,则先输出 Fu。
例如,-123456789 读作 Fu yi Yi er Qian san Bai si Shi wu Wan liu Qian qi Bai ba Shi jiu。
注意:零(ling)必须按照中国传统正确处理。
例如,100800 读作 yi Shi Wan ling ba Bai。
输入格式
共一行,包含一个不超过 9 位的整数.
输出格式
输出给定数字的中文读法,注意结尾不能有多余空格。
输入样例1:
-123456789
输出样例1:
Fu yi Yi er Qian san Bai si Shi wu Wan liu Qian qi Bai ba Shi jiu
输入样例2:
100800
输出样例2:
yi Shi Wan ling ba Bai
解法:模拟
数字每四位分成一组:[个十百千] + 万/亿
如果当前数字>0,上一位数字为0,并且在同一组内,输出ling
如果一组内都是0,不输出万/亿
时间复杂度O(n),空间复杂度O(1)
#include <iostream>
using namespace std;
char a[10][5] = {"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"};
char b[4][5] = {"", "Shi", "Bai", "Qian"};
char c[3][5] = {"", "Wan", "Yi"};
int num[10];
int main() {
int n;
cin >> n;
if (n < 0) {
cout << "Fu ";
n = -n;
}
else if (n == 0) {
cout << "ling";
}
int cnt = 0;
while (n) {
num[cnt++] = n % 10;
n /= 10;
}
bool flag = false;
for (int i = cnt - 1; i >= 0; i--) {
if (num[i] != 0) {
flag = true;
if (i + 1 < cnt && ((i + 1) % 4) != 0 && num[i + 1] == 0) {
cout << "ling" << ' ';
}
cout << a[num[i]] << ' ';
if (i % 4)
cout << b[i % 4] << ' ';
}
if (i % 4 == 0 && flag) {
cout << c[i / 4] << ' ';
flag = false;
}
}
return 0;
}