题解 | #人民币转换#
人民币转换
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")
