天天看點

PAT (Advanced Level) Practice - 1082 Read Number in Chinese(25 分)

題目連結:​​點選打開連結​​

題目大意:智能讀數。

解題思路:

if 一位數:

else:

  if 數位不為0:

    if 第一位為1,則shi開頭而不是yi shi開頭的情況。

    else。

  else:

    if 10億 && 第二位為0。

    else if 多個連續0 && 不在萬位 && 不在最後兩位。

    else if 萬位為0:

       if 1億情況,到萬位之前都是0,進入後繼續判斷該位的下一位是否為0(避免與連續0的0重複起來),pb("ling")。

       else if 10億情況,到萬位之前都是0,進入後繼續判斷該位的下一位是否為0(避免與連續0的0重複起來),pb("ling")。

#include<bits/stdc++.h>
#include<cmath>

#define mem(a,b) memset(a,b,sizeof a);
#define INF 0x3f3f3f3f
#define MOD 1000000007

using namespace std;

typedef long long ll;

vector<string> vs;

int main()
{
    string unit[11]={"","","Shi","Bai","Qian","Wan","Shi","Bai","Qian","Yi","Shi"},
            num[10]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};

    char c;
    string s;
    cin>>s;
    int fu=s[0]=='-'?1:0;
    if(fu) s.erase(0,1), printf("Fu ");
    int len=s.length();
    if(len==1) vs.push_back(num[s[0]-'0']);
    else
    {
        for(int i=0;i<len;i++)
        {
            c=s[i];
            if(c!='0')
            {
//                if(i==0 && c=='1' && unit[len-i]=="Shi") vs.push_back(unit[len-i]);
//                else vs.push_back(num[c-'0']), vs.push_back(unit[len-i]);
                vs.push_back(num[c-'0']), vs.push_back(unit[len-i]);
            }
            else
            {
                if(len==10 && i==1) vs.push_back("Yi");
                else if(i<len-1 && i!=len-5 && s[i+1]!='0')
                    vs.push_back(num[c-'0']);
                else if(len>5 && i==len-5)
                {
                    if(len==9 && s[1]=='0' && s[2]=='0' && s[3]=='0')
                    {
                        if(s[5]!='0') vs.push_back(num[c-'0']);
                    }
                    else if(len==10 && s[1]=='0' && s[2]=='0' && s[3]=='0' && s[4]=='0')
                    {
                        if(s[6]!='0') vs.push_back(num[c-'0']);
                    }
                    else vs.push_back("Wan");
                }
            }
        }
    }

    printf("%s",vs[0].c_str());
    for(int i=1;i<vs.size();i++) if(vs[i]!="") printf(" %s",vs[i].c_str());
    puts("");

    return 0;
}