题解 | #人民币转换#

人民币转换

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")


全部评论

相关推荐

狠赚笔第一人:学计算机自己不努力怪大环境?我大一就拿到了美团大厂的offer,好好看看自己有没有努力查看图片
点赞 评论 收藏
分享
10-11 15:42
皖西学院 Java
青鱼LINK:我硕士,也是java0面试,吾道不孤
点赞 评论 收藏
分享
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务