1082 Read Number in Chinese (25 point(s))
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个多小时,但测试点3始终无法通过,无奈参考了算法笔记上的代码,对照注释也很好理解
代码
#include <iostream>
#include <string>
using namespace std;
string chineseNums[10] = { "ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu" };
string wei[5] = { "Shi", "Bai", "Qian", "Wan", "Yi" };
int main()
{
string num;
cin >> num;
int len = num.size();
int left = 0, right = len - 1;
if (num[0] == '-') {//若为负,则输出Fu,并将left右移
printf("Fu");
++left;
}
while (left + 4 <= right) {
right -= 4;
}
while (left < len) {
int isPrint = 0;//表示该部分未输出过
int flag = 0;//是否累积有0
while (left <= right) {
if (left > 0 && num[left] == '0') {//若当前位为0
flag = 1;
}
else {//若当前位不为0
if (flag) {//如果存在累积0
printf(" ling");
flag = 0;
}
if (left > 0) printf(" ");//只要不是首位,则都要输出空格
isPrint = 1;//置为已输出过
cout << chineseNums[num[left] - '0'];//打印对应数字
if (left != right) cout << " " << wei[right - left - 1];//只要不是个位,要输出十百千
}
++left;
}
if (isPrint && right != len - 1) {//只要不是个位,输出万or亿
cout << " " << wei[(len - 1 - right) / 4 + 2];
}
right += 4;
}
return 0;
}