思路:
1、这题我们需要输出的是两类东西,一类是数字,另一类是单位
2、实际上我们可以将单位分为两类,一类是亿和万,这两类单位至多出现一次,另一类是个十百千,这个会反复出现,每四位数就是一个循环,但我们并不需要输出‘个’,因此代码中我将其设置为空字符串。
3、要使用计算机的逻辑处理这个数字,显然从低位到高位更合适(这也是小端存储存在的价值),但是输出则要求我们从高位到低位进行输出,因此我们引入栈这种数据结构也就理所当然了。
# include<iostream>
# include<string>
# include<stack>
using namespace std;
const string digit[]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
const string unit[]={"","Shi","Bai","Qian"};
int main(){
string s;
getline(cin,s);
if(s[0]=='-'){
s.erase(s.begin());
printf("Fu ");
} //负号可以单独处理
int cnt=0,i=s.length()-1; //引入cnt这一变量帮助我们记录处理的位数,以便适时输出单位
stack<string> st;
for(;s[i]=='0';i--)
cnt++; //一种特殊情况需要考虑的是末尾的零不需要输出单位和数字
if(i==-1) st.push("ling");
else if(4<=cnt&&cnt<8) st.push("Wan");
else if(8<=cnt) st.push("Yi"); //处理完末尾的0之后我们需要加上适当的单位
for(;i>=0;i--){
cnt++;
if(s[i]=='0'&&(st.top()=="ling"||st.top()=="Wan"||st.top()=="Yi")) continue;
else if(s[i]=='0') st.push("ling");
//当出现零后我们就需要输出一个零,但是连续的零也只输出一个,当读取到后面个零的时候我们就需要忽略,此处之所以有万和亿的原因是我们在万位数和亿位数上即使出现零也是不读零的
else if(s[i]!='0'){
if(cnt%4!=1) st.push(unit[(cnt-1)%4]); //数字入栈
st.push(digit[(s[i]-'0')]); //单位入栈
}
if(cnt==4&&i) st.push("Wan"); //至四位入万这一单位
else if(cnt==8&&i) st.push("Yi"); //至八位入亿这一单位
}
cout<<st.top(); //以下代码是依次出栈输出
st.pop();
while(!st.empty()){
cout<<' '<<st.top();
st.pop();
}
}