1082 Read Number in Chinese 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
.
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 Output 1: 1 Fu yi Yi er Qian san Bai si Shi wu Wan liu Qian qi Bai ba Shi jiu
Sample Output 2:
思路
大致题意:给你一个数,然后需要你把它用中文读出来,细节处理很多,下面分享一下本人代码还有柳神的代码。
本人思路:首先就是对负数的判断,接着就正式读数字,对于非0的数字很好处理,直接输出其数字中文 + 对应位的十百千即可,但是0就比较难处理,可能这个0需要读出来,但是又可能不需要读出来,下面我来说说我的考虑方式,首先我们需要处理一种特殊情况,就是上亿的数,比如说100000000,这种数中间是不再需要读万的,特殊处理一下。然后就是亿以内的读操作,0的读又分2种:
一种是不读:就是后面全部是0的时候;**(具体操作看代码)**
另一种就是读零:就是后面还存在不是0的数的时候;**(具体操作看代码)**
代码(本人) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 #include <iostream> #include <cstring> #include <string> using namespace std; string s1[20 ] = {"" , "" , "Shi" , "Bai" , "Qian" , "Wan" ,"Shi" ,"Bai" ,"Qian" ,"Yi" }; string s2[20 ] = {"ling" , "yi" ,"er" ,"san" ,"si" ,"wu" ,"liu" ,"qi" ,"ba" ,"jiu" };int main () { string s, ss; cin >> s; if (s[0 ] != '-' ) s = " " + s; else cout << "Fu " ; int len = s.length (); if (len == 2 && s[1 ] == '0' ) { cout << "ling" ; return 0 ; } for (int i = 1 ; i < len; i++) { int k = s[i] - '0' ; if (k) { if (s1[len - i] != "" ) ss += " " + s2[k] + " " + s1[len - i]; else ss += " " + s2[k]; } else { if (len == 9 || len == 10 ) { while (i < len && s[i] - '0' == 0 ) { if ((len - i) % 5 == 0 && (s[len - 5 ] != '0' || s[len - 6 ] != '0' || s[len - 7 ] != '0' || s[len - 8 ] != '0' )) ss += " " + s1[len - i]; i++; } i--; if (i != len - 1 && len - i != 5 ) ss += " ling" ; } else { while (i < len && s[i] - '0' == 0 ) { if ((len - i) % 5 == 0 ) ss += " " + s1[len - i]; i++; } i--; if (i != len - 1 && len - i != 5 ) ss += " ling" ; } } } if (ss[0 ] == ' ' ) cout << ss.substr (1 ); else cout << ss; }
代码(柳神) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 #include <iostream> #include <string> #include <vector> using namespace std; string num[10 ] = { "ling" ,"yi" , "er" , "san" , "si" , "wu" , "liu" , "qi" , "ba" , "jiu" }; string c[6 ] = { "Ge" ,"Shi" , "Bai" , "Qian" , "Yi" , "Wan" };int J[] = {1 , 10 , 100 , 1000 , 10000 , 100000 , 1000000 , 10000000 , 100000000 }; vector<string> res;int main () { int n; cin >> n; if (n == 0 ) { cout << "ling" ; return 0 ; } if (n < 0 ) { cout << "Fu " ; n = -n; } int part[3 ]; part[0 ]= n / 100000000 ; part[1 ]= (n % 100000000 ) / 10000 ; part[2 ] = n % 10000 ; bool zero = false ; int printCnt = 0 ; for (int i = 0 ; i < 3 ; i++) { int temp = part[i]; for (int j = 3 ; j >= 0 ; j--) { int curPos = 8 - i * 4 + j; if (curPos >= 9 ) continue ; int cur = (temp / J[j]) % 10 ; if (cur != 0 ) { if (zero) { printCnt++ == 0 ? cout<<"ling" : cout<<" ling" ; zero = false ; } if (j == 0 ) printCnt++ == 0 ? cout << num[cur] : cout << ' ' << num[cur]; else printCnt++ == 0 ? cout << num[cur] << ' ' << c[j] : cout << ' ' << num[cur] << ' ' << c[j]; } else { if (!zero && j != 0 && n / J[curPos] >= 10 ) zero = true ; } } if (i != 2 && part[i]>0 ) cout << ' ' << c[i + 4 ]; } return 0 ; }