题目链接:点击打开链接
题目大意:智能读数。
解题思路:
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; }