首页 > 代码库 > 蓝桥杯_基础训练_数的读法

蓝桥杯_基础训练_数的读法

有点恶心的一道题,做了整整半天才完全对。

思路:

把输入的数从右往左每4位进行分割。然后判断单位级数,输出即可。

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

int main()
{
    string a;
    string num[]={"ling ","yi ","er ","san ","si ","wu ","liu ","qi ","ba ","jiu "};    //存数的拼音
    string wei[]={"","shi ","bai ","qian "};              //单位读法
    string kk[]={"","wan ","yi "};                //级数读法 万 亿
    string b[3];      //存分割之后的数,从右到左每四位分为一个字符串
    while(cin>>a)
    {
        int alen=a.length();
        for(int i=0;i<3;i++)
            b[i].clear();
        int blen=0;
        int k=1;
        for(int i=a.length()-1;i>=0;i--)    //每四位进行分割字符
        {
            if(k<5)
            {
                    b[blen]+=a[i];
                    k++;
            }
            else
            {
                blen++;
                k=1;
                i++;
            }
        }
        for(int i=blen;i>=0;i--)
        {
            reverse(b[i].begin(),b[i].end());   //翻转分割之后的每组字符串
            //cout<<b[i]<<endl;
        }
        for(int j=blen;j>=0;j--)    //下标小的级数高,比如123456的分割结果:b[0]="12",b[1]="3456";
        {
            for(int i=0;i<b[j].length();i++)    //循环输出每组字符串
            {
                if(i==b[j].length()-1&&b[j][i]-‘0‘==0)   //如果到最后一位并且该位为0,
                {
                    continue;
                }
                else
                {
                    if(b[j][i]-‘0‘==0&&b[j][i+1]-‘0‘==0)   //如果中间有多个0
                        continue;
                    if(b[j][i]-‘0‘==0)                   //如果该位为0,只输出数
                    {
                        cout<<num[b[j][i]-‘0‘];
                        continue;
                    }
                    else
                    {
                        if(b[j].length()==2&&i==0&&b[j][i]==‘1‘)   //如果当前字符串的长度为2,并且最高位为1。处理十几的读法,比如12读 shi er,不读yi shi er。
                        {
                            cout<<wei[b[j].length()-i-1];
                        }
                        else
                            cout<<num[b[j][i]-‘0‘]<<wei[b[j].length()-i-1];
                    }
                }
            }
            cout<<kk[j];
        }
        cout<<endl;
    }
    return 0;
}

  

蓝桥杯_基础训练_数的读法