因为这个数据量很少,所以在这里就用了s.replace函数排除掉所有不合乎逻辑的数。留下就是正确答案。
比如第一部分可以生成例如一亿零千零百零十万零千零百零十之类的错误但包含了正确字符串的大字符串,然后用s.replace来除掉错误的组合。代码如下
#include <iostream>
using namespace std;
int main(){
string a;
cin>>a;
if(a=="0"){cout<<"ling";return 0;}
if(a[0]=='-'){
cout<<"Fu ";
a=a.substr(1);
}
string number[10]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"},danwei[3]={"","Wan","Yi"},
danwei2[4]={"","Shi","Bai","Qian"};
int num=0;
string b;
while (a[a.size()-num-1]-'0'==0)num++;//因为即使把00这种组合删掉也会最后留下一个0比如800000000就是ba Yi ling
if(4<num&&num<8)num--;
for(int i=a.size()-1-num;i>=0;i--){
if(num%4==0){
b=danwei[num/4]+' '+b;
}
else if(num%4!=0&&a[i]-'0'!=0){
b=danwei2[num%4]+' '+b;
}
if(!(num%4==0&&a[i]-'0'==0)){b=number[a[i]-'0']+' '+b;}
num++;
}//生成大字符串
for(int i=1;i<4;i++){
string s="ling "+danwei2[i];
while(b.find(s)!=-1){
b.replace(b.find(s),s.size(),danwei2[i]+" ");
}
}//抠掉ling shi
for(int i=1;i<3;i++){
string s="ling "+danwei[i]+" ";
while(b.find(s)!=-1){
b.replace(b.find(s),s.size(),danwei[i]+" ");
}
}//抠掉ling wan
string s="ling ling ";
while(b.find(s)!=-1){
b.replace(b.find(s),s.size(),"ling ");}//抠掉ling ling
s="Yi Wan ";
if(b.find(s)!=-1){b.replace(b.find(s),s.size(),"Yi ");}//抠掉Yi Wan
cout<<b;
return 0;
}