PTA1082 Read Number in Chinese (25 分)

mac2025-12-31  0

https://pintia.cn/problem-sets/994805342720868352/problems/994805385053978624

题解:模拟很复杂,以下介绍一种简单的递归调用的方法。

先处理长度在[1,4]的情况,为solve1()函数。从高位开始,每一位输出数字和对应的位的发音(qian、bai、shi)。如果出现0不要急着输出,记录0一直持续到的位置,如果持续到最后,这个0不用发音。否则直接输出0即可。如果长度在[5,8]则调用solve2()函数。solve2()函数将字符串分为两部分,四个一组分别调用solve1(),如果不足四个那就直接把那一部分拿过来。比如1234567,则调用solve1(123)和solve1(4567),中间再输出Wan;同理长度为9,调用solve3(),亿位可直接输出,剩下的为8个一组调用solve2()函数,中间输出Yi……以此类推。如果是0,则特殊考虑。如果数字在[10,19]也要特殊考虑。

代码

#include <bits/stdc++.h> using namespace std; string const read[] = {"ling","yi","er","san","si","wu","liu","qi","ba","jiu"}; string const lev[] = {"*","Shi","Bai","Qian"}; string s; vector<string>ans; void solve1(string s){ reverse(s.begin(),s.end()); int pos = s.length() - 1; while(pos >= 0){ if(s[pos] != '0'){ ans.push_back(read[s[pos]-'0']); if(pos >= 1) ans.push_back(lev[pos]); pos--; }else{ while(pos >= 0 && s[pos] == '0') pos--; if(pos == -1) break; //如果0持续到最后,这个零不用读出 else ans.push_back(read[0]); } } } void solve2(string s){ solve1(s.substr(0,s.length() - 4)); //substr(start,len)从start开始长度为len ans.push_back("Wan"); solve1(s.substr(s.length() - 4,4)); } void solve3(string s){ solve1(s.substr(0,s.length() - 8)); ans.push_back("Yi"); solve2(s.substr(s.length() - 8,8)); } void solve(string s){ ans.push_back(lev[1]); if(s[0] != '0') ans.push_back(read[s[0]-'0']); } void print(){ for(int i=0;i<ans.size();i++){ cout<<ans[i]; if(i == ans.size() - 1) cout<<endl; else cout<<' '; } } int main(){ ios::sync_with_stdio(false); while(cin>>s){ ans.clear(); if(s[0] == '-') ans.push_back("Fu"), s.erase(s.begin()); if(s == "0") ans.push_back(read[0]); //0单独处理 else if(s.length() == 2 && s[0] == '1') solve(s); //[10,19]发音单独处理 else if(0 < s.length() && s.length() <= 4) solve1(s); else if(4 < s.length() && s.length() <= 8) solve2(s); else solve3(s); print(); } return 0; }

 

最新回复(0)