题解 | #人民币转换#

人民币转换

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;
    }
}

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

牛客华为题库的题解

全部评论

相关推荐

2025-12-06 01:10
已编辑
哈尔滨工程大学 Java
一面问的真细,二面不知为啥变双机位。9.29快手主站平时怎么学习&nbsp;AI&nbsp;的,国内外知名大模型,实习公司都用的什么大模型,怎么评估效果的java池化思想,线程池构造方法的核心参数,线程池中阻塞队列注意事项,submit方法参数和执行逻辑,shutdown和shutdownnow,核心线程允许过期吗threadlocal底层,为什么key是弱引用,key回收了再get或者set这个value会怎样aqs,如何保证公平性java代理java堆划分,新生代还有别的晋升老年代的情况吗,什么时候触发gc,gc失败抛什么异常,如何排查oom,导出dump命令redis数据结构,哪个底层是跳表,和其他数据结构对比布隆过滤器会出现大key问题吗,你咋实现的布隆过滤器你怎么实现redis分布式锁,可重入,续期聚簇索引非聚簇索引select语句会加锁吗,怎么实现的不加锁undolog&nbsp;redolog&nbsp;binlog怎么能让select加锁,update这个范围加的什么锁,update一条呢手撕简单01背包,接雨水10.10快手主站意图识别用的哪个大模型,走到意图和rag的比例,faq是点击的吗自然语言怎么识别的gap一年干啥了,转正怎么样没跟组里提意向吗,研究生研究方向是传统算法吗,会大模型微调吗注册场景为什么用布隆过滤器,原理分布式锁底层的key怎么拼的,value里是什么redis持久化zset底层mysql索引结构,一个表三个字段有主键唯一索引和没索引的字段会有几个b+树,聚簇索引非聚簇索引存的啥无手撕
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务