0
点赞
收藏
分享

微信扫一扫

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

_LEON_ 2022-05-23 阅读 60


题目链接:​​点击打开链接​​

题目大意:智能读数。

解题思路:

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")。

       else pb("wan")。

AC 代码

#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;
}


举报

相关推荐

0 条评论