题解 | #人民币转换#
人民币转换
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; } }
华为题库题解 文章被收录于专栏
牛客华为题库的题解