题目大意:略。
解题思路:链接(1亿版) + 10亿的情况。
AC 代码
#include<bits/stdc++.h> #include<cmath> #define mem(a,b) memset(a,b,sizeof a); using namespace std; typedef long long ll; vector<string> vs; int main() { // const char unit[10]={' ',' ','S','B','Q','W','S','B','Q','Y'}; // 这种写法报格式错误 // const char num[10]={'a','b','c','d','e','f','g','h','i','j'}; string unit[11],num[10]; unit[1] = ""; unit[2] = "shi"; unit[3] = "bai"; unit[4] = "qian"; unit[5] = "wan"; unit[6] = "shi"; unit[7] = "bai"; unit[8] = "qian"; unit[9] = "yi"; unit[10] = "shi"; num[0] = "ling"; num[1] = "yi"; num[2] = "er"; num[3] = "san"; num[4] = "si"; num[5] = "wu"; num[6] = "liu"; num[7] = "qi"; num[8] = "ba"; num[9] = "jiu"; string s; while(cin>>s) { vs.clear(); int len=s.length(); if(len==1) // 输入只有一位,单独考虑 // printf("%s\n",num[s[0]-48].c_str()); vs.push_back(num[s[0]-48]); else { for(int i=0;i<len;i++) { if(s[i]-48!=0) // 数位上不为0的情况 { // 12:shi er --> T; yi shi er --> F if(i==0 && unit[len-i]=="shi" && s[i]-48==1) // printf("%s ",unit[len-i].c_str()); vs.push_back(unit[len-i]); else { // printf("%s %s ",num[s[i]-48].c_str(),unit[len-i].c_str()); vs.push_back(num[s[i]-48]); vs.push_back(unit[len-i]); // 如果增加 unit[1] 下面输入的时候判断下 } } else if(len==10 && i==1 && s[i]-48==0) // 10亿的特殊情况 // printf("yi "); vs.push_back("yi"); else if(i<len-1 && i!=len-5 && s[i]-48==0 && s[i+1]-48!=0) // 数位上是0的情况,有多个连续的0,只输出一个 // printf("%s ",num[s[i]-48].c_str()); vs.push_back(num[s[i]-48]); else if(len>5 && i==len-5 && s[i]-48==0) // 万位是0的情况 { if(len==9 && s[1]-48==0 && s[2]-48==0 && s[3]-48==0){ } // 1亿的情况 else if(len==10 && s[1]-48==0 && s[2]-48==0 && s[3]-48==0 && s[4]-48==0){ } // 10亿的情况 // else printf("wan "); else vs.push_back("wan"); } } } int vlen=vs.size(); for(int i=0;i<vlen;i++) { if(i==0) printf("%s",vs[i].c_str()); else if(vs[i]!="") printf(" %s",vs[i].c_str()); // else printf("#"); } puts(""); } return 0; }