题解 | #人民币转换#
人民币转换
https://www.nowcoder.com/practice/00ffd656b9604d1998e966d555005a4b
#include <iostream> using namespace std; #include <string> #include <list> string n2c(int num) { string res; switch (num) { case 0: res = "零"; break; case 1: res = "壹"; break; case 2: res = "贰"; break; case 3: res = "叁"; break; case 4: res = "肆"; break; case 5: res = "伍"; break; case 6: res = "陆"; break; case 7: res = "柒"; break; case 8: res = "捌"; break; case 9: res = "玖"; break; } return res; } string cnt2w(int cnt) { string res; switch (cnt) { case 1: res = "拾"; break; case 2: res = "佰"; break; case 3: res = "仟"; break; case 4: res = "万"; break; case 5: res = "拾"; break; case 6: res = "佰"; break; case 7: res = "仟"; break; case 8: res = "亿"; break; } return res; } int main() { string num, li; getline(cin, num, '.'); getline(cin, li); list<string> out; if (li == "00") { out.push_front("整"); } else { int a = li[1] - '0'; int b = li[0] - '0'; if (a != 0) { out.push_front("分"); out.push_front(n2c(a)); } if (b != 0) { out.push_front("角"); out.push_front(n2c(b)); } } if (num != "0") { out.push_front("元"); bool flag = false; if (num[num.size() - 1] != '0') { int t = num[num.size() - 1] - '0'; out.push_front(n2c(t)); flag = true; } int cnt = 1; for (int i = num.size() - 2; i >= 0; i--) { if (cnt == 4) { out.push_front(cnt2w(cnt)); flag = false; } if (num[i] == '0') { if (cnt <= 6 && flag) { out.push_front("零"); flag = false; } } else { flag = true; int t = num[i] - '0'; if (cnt != 4) { out.push_front(cnt2w(cnt)); } if (!(out.front() == "拾" && t == 1)) { out.push_front(n2c(t)); } } cnt++; } } cout << "人民币"; for (auto s : out) { cout << s; } }
设了一个计数器算位数,在符合位数的0开头加0,若达到“万”级别则打印万
要注意0.12这样的状态,不一定有“元”
用例是double,最多到亿,所以亿不需要固定打印
感觉这个方法还是很笨,如果要优化的话,应该是4位为一个单位,里面循环十百千,外面是万 亿 兆