1082 Read Number in Chinese (25 分)
1. 题目
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
2. 题意
给定一个不超过9位的整数,转化为用中文形式读出。例:123,中文读法为一百二十三
,输出结果为yi Bai er Shi san
;再如:-100800,中文读法为负一十万零八百
,输出结果为Fu yi Shi Wan ling ba Bai
。
3. 思路
- 定义一个结果字符串
res
。 - 如果输入整数为负数,则将
Fu
加入到结果字符串中。 - 通过除10取余法取出整数的 每一位。
- 从整数高位开始遍历整数的每一位:如果有连续零出现,那么只有在当前位不为0,当前位的高一位为0时,才将
ling
加入结果字符串,其余时候ling
均不加入结果字符串;当当前位不为0时,只要按照位数位置,将该位数字中文形式和该位置的念法加入结果字符串即可。
4. 代码
#include <iostream>
#include <string>
#include <vector>
using namespace std;
// digit to string
string dtos(int digit)
{
switch (digit)
{
case 1: return "yi";
case 2: return "er";
case 3: return "san";
case 4: return "si";
case 5: return "wu";
case 6: return "liu";
case 7: return "qi";
case 8: return "ba";
case 9: return "jiu";
case 0: return "ling";
}
return "";
}
// shi bai qian to string 十百千转中文字符串
string ctos(int cnt)
{
switch (cnt)
{
case 1: return " Shi";
case 2: return " Bai";
case 3: return " Qian";
}
return "";
}
int main()
{
int n;
cin >> n;
if (n < 0)
{
cout << "Fu ";
n = -n;
}
vector<int> digits;
// 除10取余法,取出给定整数的每一位
while (n)
{
int t = n % 10;
digits.push_back(t);
n /= 10;
}
int len = digits.size();
if (len == 0)
{
cout << "ling" << endl;
return 0;
}
// 将最高位中文形式和“十百千”之一加入结果字符串
string res = dtos(digits[len - 1]) + ctos((len - 1) % 4);
// 如果刚好最高为处于 万 或 亿 交界处,则将 万 或 亿 加入结果字符串
if (len - 1 == 4) res += " Wan";
else if (len - 1 == 8) res += " Yi";
// 从数字高位开始转化
for (int i = len - 2; i >= 0; --i)
{
// 如果当前位不为0,高位为0,将ling加入结果字符串
if (digits[i] != 0 && digits[i + 1] == 0) res += " " + dtos(0);
// 如果当前位不为0,则将当前位中文形式和“十百千”之一加入结果字符串
if (digits[i] != 0) res += " " + dtos(digits[i]) + ctos(i % 4);
// 当遍历到万和亿交界处时,将万或亿加入字符串
if (i == 4) res += " Wan";
else if (i == 8) res += " Yi";
}
cout << res << endl;
return 0;
}