题解 | #人民币转换#
人民币转换
https://www.nowcoder.com/practice/00ffd656b9604d1998e966d555005a4b
////见注释,在完善细节过程中,发现测试用例没有覆盖全部情况 #include <iostream> #include<vector> #include<sstream> #include<cstring> using namespace std; class Solution{ public: vector<string>vec={"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"}; ///////////////////0/////1////2////3////4////5////6////7////8////9/// vector<string>vec1={"仟","拾","拾","佰","万","亿","元","角","分","整"}; string yiwan(string s, int i){//每四个字符才出现的单位 if((s.size()-i-1)/4==2) return"亿"; else if((s.size()-i-1)/4==1) return"万"; else return "元"; } string part1(string s){//小数点前一部分 if(s=="0") return "";//首先判断是否为0,0一个字符,也会进入判断,输出元 string result; int num=s.size(); //num-i 距离末尾长度 for(int i=0;i<num;i++){ if((num-i)%4!=1){//此时为千百十,可通过对4取余得到位置 if(s[i]!='0'){///如果为0,会涉及连续问题,先不考虑 if(s[i-1]=='0') result+=string(vec[s[i-1]-'0']);//当前不为0,前面有0也没考虑,那如果前面有0,不管有几个,肯定输出一个,有效 if((num-i)%4==2&&string(vec[s[i]-'0'])=="壹")result+=vec1[(num-i)%4];//壹拾和十读法规定 else{ result+=string(vec[s[i]-'0']);//不是10才会加上10位 result+=vec1[(num-i)%4]; } } } else{//个位,此时涉及每四个字符出现一次的大单位 if(s[i]!='0')result+=string(vec[s[i]-'0']);//个位为0不读 if(s[i]!='0'&&s[i-1]=='0') result+=string(vec[s[i-1]-'0']);//同样个位不为0,要考虑前面的0 if(s[i]!='0'||s[i-1]!='0'||s[i-2]!='0'||s[i-3]!='0'||i==1)result+=yiwan(s,i);//当前4位有不为0的才需要单位,1位置除外 } } return result; } string part2(string s){ if(s=="00") return " "; else if(s[0]=='0'&&s[1]!='0'){ return string(vec[s[1]-'0'])+"分"; } else if(s[0]!='0'&&s[1]=='0'){ return string(vec[s[0]-'0'])+"角"; } return string(vec[s[0]-'0'])+"角"+string(vec[s[1]-'0'])+"分"; } }; int main() { double num; cin>>num; string s=to_string(num); string s1,s2; stringstream ss(s); getline(ss,s1,'.'); getline(ss,s2,'.'); s2.resize(2); ///////////// Solution solution; cout<<"人民币"; cout<<solution.part1(s1); if(solution.part2(s2)==" ") cout<<"整"; else cout<<solution.part2(s2); return 0; } // 64 位输出请用 printf("%lld")