题解 | #人民币转换#

人民币转换

https://www.nowcoder.com/practice/00ffd656b9604d1998e966d555005a4b

#include <bits/stdc++.h>

using namespace std;

unordered_map<int, string> m ={
    {0, "零"},
    {1, "壹"},
    {2, "贰"},
    {3, "叁"},
    {4, "肆"},
    {5, "伍"},
    {6, "陆"},
    {7, "柒"},
    {8, "捌"},
    {9, "玖"},
    {10, "拾"},
};

// 输入:151121.15
// 输出:人民币拾伍万壹仟壹佰贰拾壹元壹角伍分
void sayPre(string pre, string& res){
    if (pre == "0") return ; // 判断小数点前面是不是空的
    
    for(int i = 0, j = pre.size() - 1; i < pre.size(); i++, j--){
        // i代表的是我们遍历的字符串, j是我们i后面有几个数
        if(pre[i] != '0' && !(pre[i] == '1' && j % 4 == 1)){
            res += m[pre[i] - '0'];
        }
        //转换中文  // if分别对应后面输出的亿万千百十
        if(j != 0 && j >= 8 && j % 8 == 0){
            res += "亿";
        }
        if (j != 0 and j % 4 == 0 and j % 8 != 0)
            pre[i + 1] == '0' ? res += "万零" : res += "万";
        if (j != 0 and j % 4 == 3 and pre[i] != '0')
            pre[i + 1] == '0' && pre[i + 2] != '0' ? res += "仟零" : res += "仟";
        if (j != 0 and j % 4 == 2 and pre[i] != '0')
            pre[i + 1] == '0' && pre[i + 2] != '0' ? res += "佰零" : res += "佰";
        if (j != 0 and j % 4 == 1 and pre[i] != '0')
            res += "拾";
    }
    
    res += "元"; // 最后我们输出元
}

void sayEnd(string end, string& res){
    if (end == "00")
        res += "整";
    else if (end[0] == '0')
        res += m[end[1] - '0'] + "分";
    else if (end[1] == '0')
        res += m[end[0] - '0'] + "角";
    else
        res += m[end[0] - '0'] + "角" + m[end[1] - '0'] + "分";
    // 分类讨论, 讨论我们小数点后两位的所有情况
}

int main(){
    string s = "";
    while(cin >> s){
        string res = "";
        res += "人民币";
        string pre = "", end = "";
        bool xiaoShuDian = false;
        for(char ch : s){
            if(ch == '.'){
                xiaoShuDian = true;
                continue;
            }
            // 这里我们以小数点为分隔, 把小数点前面的存储到了pre里面,
            // 小数点后面的存储到了end里面
            xiaoShuDian ? end += ch : pre += ch;
        }
        
        sayPre(pre, res);
        sayEnd(end, res);
        
        cout << res << endl;
    }
}

华为题库题解 文章被收录于专栏

牛客华为题库的题解

全部评论

相关推荐

点赞 收藏 评论
分享
正在热议
# 牛客帮帮团来啦!有问必答 #
1151686次浏览 17149人参与
# 通信和硬件还有转码的必要吗 #
11203次浏览 101人参与
# 不去互联网可以去金融科技 #
20399次浏览 256人参与
# 和牛牛一起刷题打卡 #
18982次浏览 1635人参与
# 实习与准备秋招该如何平衡 #
203393次浏览 3627人参与
# 大厂无回复,继续等待还是奔赴小厂 #
4972次浏览 30人参与
# OPPO开奖 #
19203次浏览 267人参与
# 通信硬件薪资爆料 #
265924次浏览 2484人参与
# 国企是理工四大天坑的最好选择吗 #
2227次浏览 34人参与
# 互联网公司评价 #
97692次浏览 1280人参与
# 简历无回复,你会继续海投还是优化再投? #
25037次浏览 354人参与
# 0offer是寒冬太冷还是我太菜 #
454871次浏览 5124人参与
# 国企和大厂硬件兄弟怎么选? #
53903次浏览 1012人参与
# 参加过提前批的机械人,你们还参加秋招么 #
14645次浏览 349人参与
# 硬件人的简历怎么写 #
82286次浏览 852人参与
# 面试被问第一学历差时该怎么回答 #
19398次浏览 213人参与
# 你见过最离谱的招聘要求是什么? #
28108次浏览 248人参与
# 学历对求职的影响 #
161242次浏览 1804人参与
# 你收到了团子的OC了吗 #
538745次浏览 6387人参与
# 你已经投递多少份简历了 #
344237次浏览 4963人参与
# 实习生应该准时下班吗 #
96978次浏览 722人参与
# 听劝,我这个简历该怎么改? #
63525次浏览 622人参与
牛客网
牛客企业服务