题目
给定一个不超过 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)

  1. #include <iostream>
  2. using namespace std;
  3. char a[10][5] = {"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"};
  4. char b[4][5] = {"", "Shi", "Bai", "Qian"};
  5. char c[3][5] = {"", "Wan", "Yi"};
  6. int num[10];
  7. int main() {
  8. int n;
  9. cin >> n;
  10. if (n < 0) {
  11. cout << "Fu ";
  12. n = -n;
  13. }
  14. else if (n == 0) {
  15. cout << "ling";
  16. }
  17. int cnt = 0;
  18. while (n) {
  19. num[cnt++] = n % 10;
  20. n /= 10;
  21. }
  22. bool flag = false;
  23. for (int i = cnt - 1; i >= 0; i--) {
  24. if (num[i] != 0) {
  25. flag = true;
  26. if (i + 1 < cnt && ((i + 1) % 4) != 0 && num[i + 1] == 0) {
  27. cout << "ling" << ' ';
  28. }
  29. cout << a[num[i]] << ' ';
  30. if (i % 4)
  31. cout << b[i % 4] << ' ';
  32. }
  33. if (i % 4 == 0 && flag) {
  34. cout << c[i / 4] << ' ';
  35. flag = false;
  36. }
  37. }
  38. return 0;
  39. }