pat advanced 甲级 1082 字符串处理

思路:
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();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值