这道题bug改了巨久,看睛神和柳神都是分组处理的,想要试试不分组的,总算AC了
大致思路是先对字符串进行预处理
把负号先输出,然后删掉
把第一个有效字符前的所有零全都删掉
以上
然后对这个字符串一个个遍历
在输出前我们要先知道数字用中文翻译的规则,比如没有零一千对吧
然后读字符串里的字符,记录它的位置,比如亿位我记为8(从0开始)
读到非零的字符,输出,再根据它所在的位数输出它的位
读到零了,要注意Yi和Wan都得输出,然后记录连续有几个0,注意如果连续0大于等于3个,那么Wan就不必输出了。然后我们回到非零的那块
非零补充:如果它前面是0,那就多输出一个ling,Qian不能输出
下面是原题:
1082 Read Number in Chinese (25 分)
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
AC代码:
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
string num[10]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
string pos[3]={"Shi","Bai","Qian"};
int main(){
string s;
cin>>s;
if(s[0]=='-'){
cout<<"Fu ";
s.erase(s.begin());
}
while(s[0]=='0') s.erase(s.begin());
if(s.length()==0){
cout<<"ling";
return 0;
}
int preIsZero = 0,printcnt = 0;
for(int i = 0; i < s.length(); i++){
int tmp = s.length()-i-1;
if(s[i]!='0'){
if(preIsZero > 0 && tmp % 4 != 3){
if(printcnt++ > 0) cout<<" ";
cout<<"ling";
}
if(printcnt++ > 0) cout<<" ";
cout<<num[s[i]-'0'];
if(tmp % 4 == 0){
if(tmp/4==2){
if(printcnt++ > 0) cout<<" ";
cout<<"Yi";
}
else if(tmp/4==1){
if(printcnt++ > 0) cout<<" ";
cout<<"Wan";
}
}
else{
if(printcnt++ > 0) cout<<" ";
cout<<pos[(tmp % 4)-1];
}
preIsZero = 0;
}
else{
if(tmp % 4 == 0){
if(tmp/4==2){
if(printcnt++ > 0) cout<<" ";
cout<<"Yi";
}
else if(tmp/4==1 && preIsZero<3){
if(printcnt++ > 0) cout<<" ";
cout<<"Wan";
}
}
preIsZero++;
}
}
return 0;
}