参考代码:

这道题我用的递归思想,用“亿”和“万”作为分隔符,读完之后利用substr函数截取子字符串继续读取;

总的来说并不难,但这道题细节挺多的,比如多余的零不能重复读取等等,还是需要耐着性子去做,

我也是做了很久,不过AC了还是挺开心的。
#include <iostream>
#include <string>
using namespace std;
const char ans[10][10]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
void read(string a,int rep){
    if(a.size()==10){
        int t=a[1]-'0';
        if(a[0]=='1')cout<<"shi ";
        if(a[0]=='2')cout<<"er shi ";
        if(a[1]!='0')cout<<ans[t];
        cout<<" yi ";
        string s=a.substr(2);
        read(s,rep);
    }
    else if(a.size()==9){
        int t=a[0]-'0';
        cout<<ans[t]<<" yi ";
        string s=a.substr(1);
        read(s,rep);
    }
    else if(5<=a.size()&&a.size()<=8){
        int i,flag=1;
        string s=a.substr(0,a.size()-4);
        read(s,rep);
        for(i=0;i<a.size()-4;i++){
            if(a[i]!='0'){flag=0;break;}
        }
        if(!flag)cout<<"wan ";
        string str=a.substr(a.size()-4);
        read(str,rep);
    }
    else if(a.size()==4){
        int t=a[0]-'0';
        int i;
        string s=a.substr(1);
        for(i=0;i<s.size();i++){
            if(s[i]!='0')break;
        }
        if(i>=s.size()&&!rep)rep=1;
        if(a[0]!='0')cout<<ans[t]<<" qian ";
        if(a[0]=='0'&&!rep){rep=1;cout<<ans[0]<<" ";}
        read(s,rep);
    }
    else if(a.size()==3){
        int t=a[0]-'0';
        int i;
        string s=a.substr(1);
        for(i=0;i<s.size();i++){
            if(s[i]!='0')break;
        }
        if(i>=s.size()&&!rep)rep=1;
        if(a[0]!='0')cout<<ans[t]<<" bai ";
        if(a[0]=='0'&&!rep){rep=1;cout<<ans[0]<<" ";}
        read(s,rep);
    }
    else if(a.size()==2){
        int t=a[0]-'0';
        if(a[0]=='1')cout<<"shi ";
        if(a[0]!='0'&&a[0]!='1')cout<<ans[t]<<" shi ";
        if(a[0]=='0'&&!rep){rep=1;cout<<ans[0]<<" ";}
        string s=a.substr(1);
        read(s,rep);
    }
    else if(a.size()==1){
        int t=a[0]-'0';
        if(a[0]!='0')cout<<ans[t]<<" ";
    }
}
int main()
{
    string a;
    int rep=0;//判断是否有0重复
    cin>>a;
    read(a,rep);
    cout<<endl;
    return 0;
}


点赞(4)
 

0.0分

2 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 2 条评论

MySoul 3年前 回复TA
做这道题大家肯定都很辛苦,代码还可以,不过还是有bug,比如101010101过不了,这题细节非常多,感觉根本无法做到完美,只求趋近于完美吧
尼古拉斯.小白菜 4年前 回复TA
感觉可以一看